Diferencia entre flag [L] y [END] en ModRewrite de Apache
En la versión 2.3 de Apache se introduce un nuevo flag para Mod Rewrite, el flag END, éste permite indicar cuando parar en el momento que una expresión es encontrada y encaja. Mucha gente podrá pensar que es lo mismo que el tag [L] pero no es asi.
Cuando una bandera L es encontrada, singnifica que modRewrite dejará de mirar expresiones en esta iteración, pero volverá a hacer otra iteración desde el principio.
Las unicas situaciones en las que Apache parará de parsear el archivo son:
Tomemos un ejemplo:
Usando el flag L
RewriteRule (.*) index.php?seccion=$1 [L]
RewriteRule (.*) index.php?seccion=$1 [END]
Cuando una bandera L es encontrada, singnifica que modRewrite dejará de mirar expresiones en esta iteración, pero volverá a hacer otra iteración desde el principio.
Las unicas situaciones en las que Apache parará de parsear el archivo son:
- No se encuentra ninguna expresión que coincida, no se sobreescribe nada
- Una regla de salir es encontrada, por ejemplo: RewriteRule (.*) - [L]
- El script entre en un ciclo de reescritura, esto es que encuentra una coincidencia y vuelve a parsear el archivo y vuelve a encontrar otra coincidencia y asi sucesivamente. Cuando alcanza el límite (por defecto es 10, pero puede modificarse en la directiva LimitInternalRecursion) suele darse por tener expresiones que atrapan todo con el flag L
Tomemos un ejemplo:
Usando el flag L
RewriteRule (.*) index.php?seccion=$1 [L]
- /portada nos reescribe a index.php?seccion=portada
- En la siguiente iteración nos tomará como página /index.php y reescribe a index.php?sec=index.php
- En la siguiente iteración nos tomará lo mismo que anteriormente, /index.php y reescribe a index.php?sec=index.php
- Asi sucesivamente hasta alcanzar el límite de recursión.
RewriteRule (.*) index.php?seccion=$1 [END]
- /portada nos reescribe a index.php?seccion=portada
- Al tener el flag END no hay segunda iteración