
En un vhost Apache 2 tengo la siguiente configuración (en mi caso, en .htaccess
la raíz del documento (que por simplicidad es la misma para http:80 y https:443)
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
para redirigir cualquier conexión http a https Además,
ErrorDocument 500 /error.php
ErrorDocument 404 /error.php
ErrorDocument 403 /error.php
ErrorDocument 402 /error.php
ErrorDocument 401 /error.php
para producir mensajes de error personalizados. El tercer ingrediente es una subcarpeta protegida que requiere autenticación (por .htaccess
en esa carpeta):
AuthType Basic
AuthName "Test"
AuthUserFile /some/path/to/passwords
Require user joe
Todo funciona bien excepto cuando alguien intenta recuperar. http://example.com/protectedfolder
De hecho, lo que sucede es que el cliente recibe una 302 Found
respuesta con una redirección ahttps://example.com/error.php
Por otro lado,
https://example.com/protectedfolder
conduce a una costumbre (es decir, producida por error.php)401
como se esperaba.http://example.com/publicfolder
conduce a302
una redirección ahttps://example.com/publicfolder
, luego una301
redirección permanente ahttps://example.com/publicfolder/
y, finalmente (ya que DirectoryIndex está deshabilitado) un403
error personalizado. Como se esperaba.- Además,
http://example.com/nonexistent
provoca un302
tohttps://example.com/nonexistent
y luego un custom404
, también como se esperaba. - Si desactivo la
ErrorDocument 401
configuración, aparece una consulta dehttp://example.com/protectedfolder
causas401
inmediatamente, es decir, sin redirección a https.
No hay una entrada específica en Apache error.log, pero parece que el problema ocurre porque el requisito de autenticación se evalúa antes de la reescritura, por lo que invoca el ErrorDocument y sigue siendo http de manera errónea.
¿Qué necesito cambiar para tener el efecto deseado, es decir, que
http://example.com/protectedfolder
cause una redirecciónhttps://example.com/protectedfolder
y solo esa URL redirigida cause una (personalizada)401
?
Respuesta1
Dado que realiza una redirección incondicional desde http
a https
(una mala idea si desea que todos puedan acceder a la información pública de su sitio web, Por cierto), entonces deberías crear entradas de host separadas para :80
y :443
y apuntar la :80
entrada hacia algo así como una carpeta vacía; entonces no tendrías que mod_auth compita con mod_rewrite.