Question

Comment la réécriture d'URL affecte le paramètre PHP $_GET?

Dire que j'ai une URL comme je l'utilise et http://example.com/index.php?p=contact dire $_GET['p'] pour servir la index.php page de contact. Si j'utilise une règle de réécriture qui convertit l'URL http://example.com/contact, va encore du travail comme <=> prévu?

Si oui, pourriez-vous expliquer pourquoi cela fonctionne? Dans le cas contraire, quelles stratégies pourraient être utilisées pour résoudre le problème afin que la page va travailler à la fois avec et sans la réécriture?

Était-ce utile?

La solution

Oui, cela fonctionnera comme prévu.

Autres conseils

Je modifier la réponse de Grant à "Oui, cela fonctionnera la plupart du temps comme prévu."

Le comportement de «Plus précisément, en ce qui concerne mod_rewrite les chaînes de requête existantes peut être surprenant. À titre d'exemple, prenons la règle suivante, qui convertit l'URL que vous avez fourni:

RewriteRule /contact /index.php?p=contact

réécrira correctement à /contact et le nom /index.php?p=contact page sera accessible par $_GET['p']. Toutefois, si vous utilisez cette technique avec un script qui utilise des paramètres autres que le nom de la page, il devient un peu plus délicat. Cette règle se traduit également à /contact?person=Joe person=Joe. Le paramètre disparaît entièrement [QSA]! Il y a deux façons de traiter cette question.

La façon la plus simple est d'utiliser le /index.php?p=contact&person=Joe ( « append chaîne de requête ») drapeau sur votre règle, ce qui placera la chaîne de requête initiale après les paramètres fournis dans la règle, traduire <= > à p=:

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

Cependant, cela permet à votre paramètre pour obtenir écrasé /contact?p=about. La visite va obtenir réécrite /index.php?p=contact&p=about à QUERY_STRING, donc retournera <=> « au sujet » dans votre script, pas « contact ». Pour résoudre ce problème, utilisez plutôt la variable de <=>:

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

Cela garantit que sera <=> toujours retour « contact » lors de l'utilisation de cette règle, que vos visiteurs de jouer avec vos URL. : -)

Lors de la réécriture d'une URL cela se fait par mod_rewrite - la page récupérée à la fin est toujours une « vieille », à savoir index.php p = contact?. En d'autres termes, le navigateur récupère contact /. mod_rewrite réécrit alors à index.php? p = contact. Le script, de ce fait, ne sait pas que ré-écriture est arrivé - il s'appelait encore son chemin « d'habitude ». Par conséquent, une telle réécriture fonctionnera. Vous voudrez peut-être penser comme un proxy de réécriture qui demande une page différente de celle du navigateur d'origine demandé.

Lorsque le client demande http://example.com/contact , le serveur utilise la règle de réécriture pour servir les http://example.com/index.php?p=contact au lieu . Le client ne sera pas en mesure de voir l'URL réécrite et pourrait même ne pas être en mesure de dire qu'il a été réécrite. Demander soit URL que le client vous donnera exactement la même page.

est-il pas le cas que la modification des têtes après avoir rendu des parties de la page peut provoquer des hauts vis dans les pages php? Comment allez-vous réécrivez l'URL? Peut-être que mal comprendre ...

Vous réécrivez l'URL de la /contact /index.php?p=contact, donc oui, ça va fonctionner comme prévu.

Dans votre cas, cela ne fonctionnerait pas. mod_rewrite, après qu'il trouve une correspondance et récrit http://example.com/index.php?p = contacter http://example.com/contact , fait une redirection interne. Même après la redirection, la nouvelle URI redirigé, peut encore être comparés à une condition et plus redirigés.

Dans tous les cas, les URIs entrants ne sont pas conservés en mémoire, donc même pas Apache peut reconstruire ce que l'URI était d'origine. PHP, au moment où il est exécuté, ne sait pas non plus l'URI d'origine. Par conséquent, vous perdez vos _GET $ vars, en tant que variables envoyées par GET sont contenus dans l'URL, qui était, maintenant, transformé, et PHP Remplit associatif $ array _GET en analysant les requêtes entrantes.

Offrir un soutien à la fois serait laborieux. Si vous avez http://domain.com/segment1/segment2/segment3 vous devez associer les segments avec quelque chose de significatif. Vous souhaitez dépouillez votre domaine et éclatez sur « / », et dans votre cas, vous pouvez dire que le premier segment demande la page, et http://example.com/contact/ vous pouvez extraire la page = 'contact'

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top