2010-01-20 24 views
25

Dadas estas condiciones (sé lo que quieren decir/hacer):mod_rewrite: ¿qué hace este RewriteRule?

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 

¿Qué hace la regla primera? ¿Para qué es esa carrera solitaria?

RewriteRule ^.*$ - [NC,L] 
RewriteRule ^.*$ /index.php [NC,L] 

He estado usando esto por bastante tiempo en combinación con el Zend Framework, pero nunca me dieron lo que hace exactamente la primera regla.

Respuesta

46

El RewriteCond directive solo describe una condición adicional para un RewriteRule directive. Por lo tanto, RewriteCond siempre debe estar asociado con un RewriteRule.

En su caso los tres RewriteCond probablemente pertenecen a la primera RewriteRule así:

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L] 

Ahora se aplica esta regla si el patrón de la RewriteRule coincide con la URL de solicitud actual (por directorio ruta despojado antes) y si se cumple esta condición.

En este caso, la condición sólo es cierto si hacer el mapa de la URL de solicitud al sistema de archivos que coincide con un archivo existente con el tamaño de archivo mayor que 0 (-s), o un enlace simbólico (-l) o un directorio (-d) Por lo tanto, su regla se aplicará a cualquier URL (^.*$ que coincida con cualquier cosa) que pueda correlacionarse con algo existente en su sistema de archivos. La sustitución - solo significa no cambiar nada. Y el NC (ningún caso, sensible a mayúsculas, inútil en este contexto) y L (última regla si aplica) son flags que modificar ya sea el patrón, la sustitución o la ejecución de la regla.

+0

Aaahh sí, eso tiene sentido. Explicación muy clara. Gracias. –

+0

Entonces, ¿cuál es el propósito de no cambiarlo? Es la combinación de las 2 reglas de reescritura que dicen "si existe, muéstrela, de lo contrario reenvía todo lo demás a index.php" –

+1

@WillshawMedia Sí, la regla mencionada básicamente deja intacta cualquier solicitud a un archivo existente y sale del proceso de reescritura. Por lo tanto, en combinación con la otra regla: vuelva a escribir solo cualquier archivo que no exista en * index.php *. – Gumbo

Cuestiones relacionadas