2009-02-02 19 views
9

¿Cómo afecta la reescritura de URL el parámetro $_GET para PHP?

Supongo que tengo una URL como http://example.com/index.php?p=contact y uso $_GET['p'] para indicar index.php para mostrar la página de contacto. Si utilizo una regla de reescritura que convierta la URL a http://example.com/contact, ¿funcionará el $_GET['p'] como se esperaba?

Si lo hace, ¿podría explicar por qué funciona? Si no, ¿qué estrategias podrían usarse para resolver el problema de modo que la página funcione tanto con y sin la reescritura?

+0

Ahora en serio, soy yo el único notar aquí que él está tratando de convertir a http://example.com/index.php?p=contact http://example.com/contact, y no http://example.com/contactar con http://example.com/index.php?p=contacto, como todos los que están haciendo aquí? –

+0

No entendí cómo funcionaba, pero las respuestas aquí ayudaron a corregir mi comprensión. – VirtuosiMedia

Respuesta

4

Sí, eso funcionará como se esperaba.

+0

Entonces, ¿la reescritura simplemente sobrescribe la URL a la barra de direcciones en el navegador pero aún sirve la URL no escrita para el script? – VirtuosiMedia

+0

Escribe www.example.com/page/8 y reescribe ve la página/8 y lo cambia a index.php? Page = 8 antes de que su script php lo vea. – Grant

+0

reescribir puede cambiar la URL internamente sin decirle al usuario o redirigirla inmediatamente a la nueva url, según los parámetros que use. Incluso puede proxy en una nueva página desde otro servidor si se lo indica. – Grant

0

Reescribe la URL desde /contact hasta /index.php?p=contact, entonces sí, funcionará como se esperaba.

0

¿No es el caso que la modificación de los encabezados después de haber renderizado partes de la página puede causar problemas en las páginas php? ¿Cómo estás reescribiendo la URL? Quizás malinterprete ...

+0

pensé que con mod_rewrite o algo similar – SilentGhost

+0

La reescritura sería a través de una regla de reescritura de Apache. No sé mucho al respecto, de ahí la pregunta, pero no creo que los encabezados se hayan tocado en absoluto. – VirtuosiMedia

+0

¿Sería posible que usted pueda utilizar el poste en lugar de conseguir y luego crea un subdirectorio ROOT/contacto en su WebDir cuyo índice de Apache señala en la página correcta? Es una solución extraña, pero puede resolver los dos problemas mencionados ... –

1

Al reescribir una URL esto se hace mediante mod_rewrite - la página recuperada al final sigue siendo la "vieja", es decir, index.php? P = contact. En otras palabras, el navegador recupera/contacto. mod_rewrite luego lo reescribe en index.php? p = contact. El guion, debido a esto, no sabe que ocurrió ninguna reescritura, todavía se llama su forma "usual". Por lo tanto, tal reescritura funcionará. Es posible que desee considerarlo como un proxy de reescritura que solicita una página diferente a la solicitada por el navegador de origen.

1

Cuando el cliente solicita http://example.com/contact, el servidor utiliza la regla de reescritura para que les sirva http://example.com/index.php?p=contact. El cliente no podrá ver la URL reescrita y es posible que ni siquiera pueda decir que se reescribió. Al solicitar cualquiera de las URL, el cliente le daría exactamente la misma página.

-2

En su caso, no funcionaría. mod_rewrite, después de encontrar una coincidencia y reescribe http://example.com/index.php?p=contact en http://example.com/contact, realiza una redirección interna. Incluso después de la redirección, el nuevo URI redireccionado aún se puede comparar con una condición y redirigirse posteriormente.

En cualquier caso, los URI entrantes no se guardan en la memoria, por lo que ni siquiera Apache puede reconstruir el URI original. PHP, cuando se ejecuta, tampoco conoce el URI original. Por lo tanto, pierde sus $ _GET vars, ya que las variables enviadas a través de GET están contenidas en la URL, que fue, por ahora, transformada, y PHP rellena la matriz asociativa $ _GET al analizar las solicitudes entrantes.

Ofrecer soporte para ambos sería minucioso. Si tiene http://domain.com/segment1/segment2/segment3, debe asociar los segmentos con algo significativo. Quitaría su dominio y explotaría en '/', y en su caso podría decir que el primer segmento solicita la página y desde http://example.com/contact/ puede extraer la página = 'contacto'

+0

Depende de la regla de reescritura. Dependiendo de la regla, podría ser susceptible a otras reglas o detenerse ahí mismo. Puedes perder get vars, pero eso depende de las reglas de reescritura, que VirtuosiMedia aún no ha comenzado a construir, por lo que es un punto discutible de todos modos. – Grant

+0

Pues bien, en su caso, al pasar de http://example.com/index.php?p=contact a http://example.com/contact habría que despojar de cualquier GET vars, por lo que no $ _GET [ 'p' ] no funcionaría. –

+0

@kRON: también te despojará de un script, ¿no crees? – SilentGhost

31

Enmendaría la respuesta de Grant a "Sí, eso funcionará en su mayoría como se esperaba".

Específicamente, el comportamiento de mod_rewrite con respecto a las cadenas de consulta existentes puede sorprender.Como ejemplo, tomemos la siguiente regla, que convierte la URL que ha proporcionado:

RewriteRule /contact /index.php?p=contact 

Esto volverá a escribir correctamente /contact-/index.php?p=contact y el nombre de la página será accesible a través $_GET['p']. Sin embargo, si utiliza esta técnica con una secuencia de comandos que utiliza parámetros que no sean el nombre de la página, se vuelve un poco más complicado. Esta regla también traduce /contact?person=Joe a /index.php?p=contact. ¡El parámetro person=Joe desaparece por completo! Hay dos formas de lidiar con esto.

La forma más sencilla es utilizar el ("cadena de consulta de datos anexados") bandera [QSA] en su regla, que situará a la cadena de búsqueda original después los parámetros proporcionados en la regla, la traducción de /contact?person=Joe a /index.php?p=contact&person=Joe:

RewriteRule /contact /index.php?p=contact [QSA] 

Sin embargo, esto hace que sea posible para su parámetro p= llegar sobrescribe. Visitando /contact?p=about conseguirá reescrito para /index.php?p=contact&p=about, por lo $_GET['p'] volverá "aproximadamente" en su guión, no "contacto". Para resolver esto, utilice la variable QUERY_STRING lugar:

RewriteRule /contact /index.php?%{QUERY_STRING}&p=contact 

Esto garantiza que se $_GET['p']siempre retorno "contacto" cuando se utiliza esta regla, independientemente de si sus visitantes están metiendo con sus URL. :-)

+0

Gracias por señalar algunos de los puntos más finos – VirtuosiMedia

+1

Bueno, esta misma cosa me tomó desprevenido durante el fin de semana, así que pensé en compartir. :-) –

+4

Quitaría por completo la palabra "contacto" de la cadena de consulta: 'RewriteRule^(. +) $ Index.php/$ 1' significa que se puede acceder a" contacto "en' $ _SERVER ['PATH_INFO'] 'en lugar de' $ _GET ['q'] '. Otros parámetros '$ _GET' no se ven afectados. – TRiG