Em um Apache 2 vhost tenho a seguinte configuração (no meu caso, na .htaccess
raiz do documento (que é para simplificar o mesmo para http:80 e https:443)
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
para redirecionar quaisquer conexões http para https Além disso,
ErrorDocument 500 /error.php
ErrorDocument 404 /error.php
ErrorDocument 403 /error.php
ErrorDocument 402 /error.php
ErrorDocument 401 /error.php
para produzir mensagens de erro personalizadas. O terceiro ingrediente é uma subpasta protegida com autenticação necessária (por .htaccess
nessa pasta):
AuthType Basic
AuthName "Test"
AuthUserFile /some/path/to/passwords
Require user joe
Tudo funciona bem, exceto quando alguém tenta recuperar http://example.com/protectedfolder
Na verdade, o que acontece é que o cliente recebe uma 302 Found
resposta com redirecionamento parahttps://example.com/error.php
Por outro lado,
https://example.com/protectedfolder
leva a um custom (ou seja, produzido por error.php)401
conforme o esperado.http://example.com/publicfolder
leva a302
redirecionar parahttps://example.com/publicfolder
, em seguida, um301
redirecionamento permanente parahttps://example.com/publicfolder/
, e finalmente (como DirectoryIndex está desabilitado) um403
erro personalizado. Como esperado.- Além disso,
http://example.com/nonexistent
causa um302
tohttps://example.com/nonexistent
e, em seguida, um customizado404
, também conforme o esperado. - Se eu desabilitar a
ErrorDocument 401
configuração, uma consulta dehttp://example.com/protectedfolder
causas401
imediatamente, ou seja, sem redirecionamento para https.
Não há uma entrada específica no Apache error.log, mas parece que o problema ocorre porque o requisito Auth é avaliado antes do Rewrite, assim invoca o ErrorDocument e que erroneamente ainda é http??
O que eu preciso mudar para ter o efeito desejado, ou seja, que
http://example.com/protectedfolder
causa um redirecionamento parahttps://example.com/protectedfolder
e somente essa URL redirecionada causa um (personalizado)401
?
Como você faz redirecionamento incondicional de
http
parahttps
( uma má ideia se quiser que todos possam acessar as informações públicas em seu site , BTW), então você deve apenas fazer entradas de host separadas para:80
e:443
e apontar a:80
entrada para algo como uma pasta vazia - então você não teria mod_auth competindo com mod_rewrite.