
Servidor: Debian Jessie Apache: 2.4.9-1 PHP: 5.5
Lo que quiero es que todo lo que no sea archivos ni directorios se redirija a index.php, donde los manejo yo mismo. Debido a la naturaleza de mi proyecto, debo trabajar desde un host virtual.
Estoy usando alojamiento virtual (vHosts) junto con mod_rewrite en un proyecto web en el que estoy trabajando. Aquí está el archivo vHost...
<VirtualHost *:80>
ServerName foo.com
ServerAlias www.foo.com
ServerAdmin [email protected]
DocumentRoot /srv/foo/main/www/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php [L]
</IfModule>
</VirtualHost>
El vHost funciona como se esperaba y las reglas de reescritura redirigen las solicitudes a index.php como se esperaba. Sin embargo, cuando intento acceder a archivos en el servidor, por ejemplo:
foo.com/css/style.css
situado en:
/srv/foo/main/www/css/style.css
mi solicitud es redirigida a index.php
Esto es extraño ya que se supone que las declaraciones de condición de reescritura solucionan eso.
Todos los permisos de carpeta están establecidos en 755, todos los archivos en 644.
He podido confirmar sin lugar a dudas que las condiciones de reescritura coinciden cuando no deberían serlo. Pude ver esto mirando el registro de errores de Apache con la salida de depuración habilitada para mod_rewrite.
¿Por qué las dos declaraciones RewriteCond no coinciden correctamente?
¿Quizás no ven vHost DocumentRoot?
ACTUALIZACIÓN: APAGAR el motor de reescritura me permite acceder al archivo que estoy probando. Es decir, mi URI es correcta. Sé que mi camino es bueno, las condiciones simplemente fallan por alguna razón.
Respuesta1
Para cualquiera que use Apache 2.4 con hosts virtuales y desee usar mod_rewrite dentro de dicho vHost con condiciones de reescritura que necesiten verificar archivos o carpetas dentro del vHost, así es como se realizan las condiciones de reescritura...
<VirtualHost *:80>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.*)$ /index.php [L]
</IfModule>
</VirtualHost>
Se me ocurrió esto y parece estar funcionando bien.
La explicación...
%{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI}
le dará una raíz de documento sensible al contexto. Es decir, la raíz del documento DESPUÉS de que se haya aplicado el alojamiento virtual. Pero no le dará el URI, por lo que debemos agregarlo %{REQUEST_URI}
para finalizar el trabajo.
CONTEXT_DOC_ROOT == /srv/foo/main/www
REQUEST_URI == /css/estilo.css
CONTEXT_DOC_ROOT + REQUEST_URI == /srv/foo/main/www/css/style.css
El resto es fácil. Salsa impresionante. ¡Espero que esto ayude!