2012-09-30 24 views
6

considerar lo siguiente:

RewriteRule ^(.*)$ index.php/$1 

Basándose en el conocimiento del novato novato que tengo de mod_rewrite, este debe coincidir con toda la parte URL entre example.com/ y ?query=string, y luego se anteponga index.php/, y, en general, eso es exactamente lo que sucede .

http://example.com/some/stuff -> http://example.com/index.php/some/stuff 

Ahora, tenga en cuenta:

RewriteRule . index.php 

Según los desarrolladores de la presente actualización a la Concrete5 CMS, esto hace exactamente lo mismo. Y, de hecho, parece hacer eso en mi servidor también.

Mi pregunta es, ¿por qué el segundo RewriteRule yeild el mismo resultado en lugar de algo así como

http://example.com/some/stuff -> http://example.com/index.phpome/stuff 

No debería el partido . un personaje y luego ser sustituida por la cadena index.php? Esto está en Apache 2.2.

Respuesta

1

RewriteRule ^(.*)$ index.php/$1 coincidirá y utilizará el texto capturado para crear una nueva ruta con lo que se solicitó originalmente agregado al final donde está el $1.

RewriteRule . index.php coincidencias porque es una expresión regular sin anclaje. La expresión regular anterior usa ^ y $ para anclar la coincidencia, lo que significa que el patrón debe coincidir completamente mientras que este no, lo que significa que coincidirá con en cualquier lugar en la cadena, por lo que cualquier cadena con cualquier carácter coincidirá. Como mod_rewrite trata cada prueba como un predicado en ejecución, esta regla se aplicará siempre que coincida.

Cuando se cumple la regla, la sustitución tiene lugar. La sustitución es una sustitución completa, por lo que si no utiliza referencias posteriores como $1, se pierde todo lo que estaba en el patrón original. En este caso, la nueva ruta se convierte en index.php.

Por lo tanto, existe una ligera diferencia entre los 2, ya que el segundo solo va directamente a index.php sin agregar la ruta solicitada originalmente hasta el final. Lo más probable es que Concrete5 CMS esté usando un controlador frontal que distribuye de acuerdo con la información que extrae directamente de la solicitud. Como no se trata de una reescritura de redireccionamiento, la solicitud original se conservará, por lo que solo se utilizará en su lugar: se transfiere parte de la responsabilidad de Apache a las manos del código de la aplicación, con la consiguiente menor dependencia del entorno de alojamiento.

0

El partido de la izquierda no es reemplazado , no es más que buscado. Debe usar referencias para reemplazar/retener partes específicas.

+0

Los documentos dicen que la sintaxis es 'RewriteRule Pattern Substitution [flags]', ¿no? Todavía no tengo claro cómo la "sustitución" en el segundo ejemplo produce el resultado que lo hace. – NReilingh

+0

Si 'Patrón' coincide, entonces realiza' Sustitución' * en toda la ruta que ha examinado *. –

Cuestiones relacionadas