2011-05-15 9 views
7

Estaba experimentando con mod-rewrite. Pensé que lo que quería era simple, pero no obtengo el URI del archivo solicitado a través de REQUEST_URI. Más bien, el nombre que se entrega se transmite.mod-rewrite THE_REQUEST y (REQUEST_URI o REQUEST_FILE) dan diferentes nombres de archivo, ¿por qué?

El manual dice:

THE_REQUEST

La solicitud línea completa HTTP enviada por el navegador al servidor (por ejemplo, "GET /index.html HTTP/1.1"). Esto no incluye ningún encabezado adicional enviado por el navegador. Este valor de no se ha escapado (decodificado), a diferencia de la mayoría de las otras variables a continuación.

REQUEST_URI

el recurso solicitado en la línea de petición HTTP. (En el ejemplo anterior , esto sería "/index.html".)

Sin embargo los dos dan diferentes nombres de archivo en mis pruebas. Tengo un bootstrap.php a través del cual quería enviar todas las solicitudes. Este es el archivo de prueba:

<?php 
echo $_GET['requestedURI']; 
?> 

en el archivo .htaccess que tengo:

### REWRITE RULES ### 
RewriteEngine on 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .+ bootstrap.php?requestedURI=%{REQUEST_URI} [L] 

Solicitando http://localhost/test.htm pone a cabo: /bootstrap.php

si pongo THE_REQUEST en lugar de REQUEST_URI en el .htaccess obtengo GET /test.htm HTTP/1.1

Entonces, ¿por qué no conformarse con THE_REQUEST? Bueno, tan pronto como una cadena de consulta existe, las cosas se rompen. Si solicito: http://localhost/test.htm?x=1&y=2 obtengo GET /test.htm?x=1 el primer ampersand rompe las cosas. Creo que debería ser posible reemplazar todos los signos & en la cadena de consulta con% 26 para que funcione, pero no lo logré hasta ahora ...

¿Alguien puede decir por qué REQUEST_URI falla y cómo solucionarlo o cómo reescribe los signos y signos a% 26 en la cadena de consulta?

Gracias.

EDITAR: El informe anterior se aplica a xampp 1.7.3 en Win 7. Lo intenté en un sistema de producción Linux mientras tanto y allí REQUEST_URI devuelve lo que debería.

Respuesta

3

No necesita pasar explícitamente la ruta y la consulta de URI solicitadas, ya que puede acceder a ella en PHP a través del $_SERVER['REQUEST_URI']. Por lo tanto esto debería ser suficiente:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .+ bootstrap.php 
+0

Gracias, ese es un buen punto. Estaba complicando las cosas, parece. Todavía es gracioso que los dos servidores (win/linux - si eso tiene algo que ver con eso) se comportarían de manera diferente en REQUEST_URI en el .htaccess –

+0

@CO: * REQUEST \ _URI * en mod_rewrite no siempre es el URI solicitado originalmente pero puede también será una versión ya reescrita, como en su caso, donde el ['L' flag] (http://httpd.apache.org/docs/current/rewrite/flags.html#flag_l) causa un redireccionamiento interno. – Gumbo

2

He mirado un poco, y no he encontrado ninguna buena explicación de por qué %{REQUEST_URI} se comporta como en el ejemplo. La forma más común de lograr lo que tu estás después parece que hay referencias hacia atrás:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)$ bootstrap.php?requestedURI=$1 [L] 

Edición

Basado en su comentario, parece que REQUEST_URI y REQUEST_FILENAME se actualizan y reevaluado cuando el RewriteRule se dispara.

+0

no he mencionado anteriormente REQUEST_FILENAME pero usarlo en mi ejemplo pone a cabo: D: /Web_Root/bootstrap.php. Extrae el nombre de archivo de eso, así que simplemente saca bootstrap.php. Hace exactamente lo mismo que usar REQUEST_URI. Lanza "bootstrap.php", que es el archivo redireccionado en lugar del nombre del archivo originalmente solicitado ... impar. –

+0

He actualizado mi respuesta con lo que creo que está sucediendo. ¿Ha intentado usar una retro referencia en su lugar? –

+0

Puedo informar lo mismo. En algunas configuraciones, '% {REQUEST_URI}' parece estar alterado. –

Cuestiones relacionadas