
Em um vhost Apache 2 eu tenho a seguinte configuração (no meu caso, na .htaccess
raiz do documento (que é a mesma 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
dentro dessa 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 esperado.http://example.com/publicfolder
leva ao302
redirecionamento 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 porhttp://example.com/protectedfolder
causa401
imediatamente, ou seja, sem redirecionamento para https.
Não há nenhuma entrada específica no Apache error.log, mas parece que o problema ocorre porque o requisito Auth é avaliado antes da Reescrita, invocando assim o ErrorDocument e que ainda é http??
O que preciso alterar para ter o efeito desejado, ou seja, que
http://example.com/protectedfolder
cause um redirecionamento parahttps://example.com/protectedfolder
e somente esse URL redirecionado cause um (personalizado)401
?
Responder1
Já que você redireciona incondicionalmente de http
para https
(uma má ideia se você deseja que todos possam acessar as informações públicas em seu site, BTW), então você deve apenas criar 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 o mod_auth competindo com o mod_rewrite.