Atención al titulo, soy un hacha jugando con keywords para atraer a todo tipo de audiencia al blog… y no, no se ha muerto Apache y los módulos se pelean por la pasta… en fin, al turrón. Pongamos que tenemos una web http://www.pepe.com, que en el servidor corresponde al path /home/web/pepe, y un subdirectorio http://www.pepe.com/admin, cuya ruta es /home/web/pepe/admin.

En mi caso concreto pepe.com es un dominio antiguo, y quiero que toda referencia a él acabe en el nuevo, digamos paco.com. Para ello utilizo un htaccess que hace una redirección 301 a lo bruto:

# colocado en /home/web/pepe/.htaccess
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^(.*)$ http://www.paco.com [R=301,L]

Éste es mi problema concreto, pero por ejemplo es también muy común en frameworks y CMS hacer una redirección general de todas las peticiones a un único fichero. Vamos, que aquí lo importante es la reescritura general.

Ahora lo que quiero es proteger con contraseña el acceso a mi administración, por lo que utilizo otro htaccess con el contenido estándar para ésto:

# colocado en /home/web/pepe/admin/.htaccess
AuthType Basic
AuthUserFile /home/web/pepe/admin/.htpasswd
AuthName "Acceso Administrador"
Require valid-user

Y como no podía ser de otra forma el invento no funciona. Cuando intento acceder a http://www.pepe.com/admin me redirige a http://www.paco.com, luego el primer cambio es meter una excepción para que no aplique la regla de reescritura para la URL que nos interesa. Lo podemos hacer en el htaccess principal con una condición:

# colocado en /home/web/pepe/.htaccess
Options +FollowSymlinks
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/admin/?
RewriteRule ^(.*)$ http://www.paco.com [R=301,L]

O si no necesitamos de ninguna reescritura en el directorio hijo podemos directamente desactivar el engine:

# colocado en /home/web/pepe/admin/.htaccess
RewriteEngine off
AuthType Basic
AuthUserFile /home/web/pepe/admin/.htpasswd
AuthName "Acceso Administrador"
Require valid-user

Cojonudo, pero sigue haciendo la redirección. Primera comida de cabeza importante: comento todas las reglas de reescritura y sigue redirigiendo ¿? resulta que Firefox cachea las redirecciones (al menos las 301), así que ya puedes darle a F5 y estar correctas las reglas, que no te enterarás si no borras la caché del navegador, eso o utilizar Explorer (no lo he probado en el resto).

Descartado el navegador, ésto sigue sin rular. Utilizando el imprescindible HttpFox y Google descubro que la autenticación básica de Apache que queremos usar manda una cabecera 401 Unauthorized, que el navegador recibe y es cuando muestra el cuadro de usuario/contraseña. Segunda comida de cabeza importante: el servidor está buscando un mensaje de error personalizado para el 401 (en una directiva ErrorDocument), que no encuentra y por tanto lanza, adicionalmente, un 404. Y resulta que, no me preguntes por qué, este último error pasa por la reescritura general y es lo que está provocando la redirección. Acojonante. La solución es definir dicho ErrorDocument en nuestro htaccess:

# colocado en /home/web/pepe/.htaccess
Options +FollowSymlinks
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/admin/?
RewriteRule ^(.*)$ http://www.paco.com [R=301,L]
ErrorDocument 401 "Acceso restringido"

¡Aparece el cuadro para meter usuario/contraseña! joder, ha costado.