Apache2 mod_rewrite URL limpia: funciona, pero no se puede acceder a los archivos

Apache2 mod_rewrite URL limpia: funciona, pero no se puede acceder a los archivos

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!

información relacionada