Primero les voy a decir cómo leer su RewriteRule:
Se empieza con la primera (o siguiente) RewriteRule entrada:
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
El primer parámetro es una expresión regular que puede coincidir con la URL solicitada. ^(.*)$
combina todo, y almacena este "todo" dentro de una variable que se puede usar más adelante.
sólo si hay precedente entradas RewriteCond, se evalúan siguiente:
RewriteCond $1 !^(index\.php|resources|robots\.txt)
$1
es una referencia al contenido emparejado dentro de los primeros paréntesis de RewriteRule. Esto se compara con el segundo parámetro, que es una expresión regular que indica varios nombres explícitos, y el !
niega la expresión, p. esta regla permite la ejecución de RewriteRule solo si la expresión regular no coincide. Si esta condición devuelve verdadero, se examinará la siguiente condición.
RewriteCond %{REQUEST_FILENAME} !-f
Si el nombre del archivo solicitado ningún archivo real en el disco duro, esta condición es verdadera.
RewriteCond %{REQUEST_FILENAME} !-d
Si el nombre del archivo solicitado es ningún directorio real, esta condición es verdadera.
Sólo si todas estas condiciones son verdaderas (que se encadenan con Y), volvemos a la regla de reescritura:
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
El resultado de este paso de reescritura se define como la segunda y tercera parámetro. $1
se usa de nuevo como con el contenido de la coincidencia, y los parámetros definen que esta regla, si coincide inicialmente, será la última regla (L) y que cualquier cadena de consulta definida en el objetivo de reescritura se agregará a cualquier cadena de consulta en la URL original (QSA).
Crítica:
La reescritura de costumbre para los marcos MVC tratar de ser lo más performante como sea posible. Todas las condiciones de reescritura deben evaluarse para una reescritura exitosa. Se detendrá solo si alguno de RewriteCond devuelve falso. Toda solicitud que se reescribe está sujeta a muchas pruebas intensivas de la CPU. Primero la regex RewriteRule, luego la regex en la primera RewriteCond, seguida de dos pruebas de disco duro en el sistema de archivos para la existencia de archivos.
Por otro lado, el primer RewriteCond parece ser innecesario. Comprueba ciertos nombres, y si se encuentra, cancela la reescritura. "index.php" debería ser detectado por el segundo RewriteCond, porque es un archivo existente (cómo no funcionaría la reescritura). Cualquier cosa que comience con "recursos" también se emparejará, pero probablemente no debería ser por las mismas razones: los recursos existentes los encontrará el segundo RewriteCond. Por último, el archivo "robots.txt". Siempre es una buena idea tener uno, posiblemente emtpy si quiere evitar 404 cuando los robots buscan su sitio.
Como no está cambiando nada en la cadena de consulta, la directiva [QSA] no es necesaria.
Mejoras:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [L]
RewriteRule ^.*$ index.php [L]
La primera RewriteRule coincidirá con toda la trayectoria solicitada. Los dos RewriteCond están conectados con [OR], por lo que el primer RewriteCond que devuelve verdadero cancelará la evaluación posterior. El primer RewriteCond prueba si el archivo solicitado existe. Si existe, devuelve verdadero y el proceso vuelve al primer RewriteRule. La expresión objetivo es "-", lo que significa "no reescribir". El [L] detiene el procesamiento posterior de las reglas de reescritura. Así que, al final, para un archivo existente, solo tenemos una prueba de sistema regex y una de archivo, y después de eso, este archivo existente se enviará al navegador.
Si no se encontró ningún archivo, la primera RewriteRule y RewriteCond no se activarán, por lo que [L] no se detendrá el proceso. Entonces, se ejecuta el segundo RewriteRule. Este es incondicional, y la expresión regular es la misma que antes, haciendo coincidir todo y reescribiéndola en "index.php".
Esta reescritura no llamará a su index.php si existe algún archivo, incluyendo /forum/login.php.
Puede cambiar el segundo a RewriteRule ^.*$ index.php/$0 [L]
si desea continuar el análisis $_SERVER['PATH_INFO']
en lugar de $_SERVER['REQUEST_URI']
.
¡Gracias! He estado buscando este nivel de explicación durante meses. – wallyk
Corrección está funcionando ahora. –
Esto es tan increíblemente minucioso y necesita MUCHO más crédito del que se le ha otorgado. –