2009-07-12 2 views
0

J'ai un problème ennuyeux. J'ai un script qui utilise la fonction $ _GET de php pour obtenir une variable de l'URL de la page. Cependant, je dois savoir, d'abord et avant tout, faire ma page URL aller de

http://www.example.com/dir/dir2/page.php?value=something&anothervalue=somethingelse

à

http://www.example.com/something/dir2/somethingelse/page.php

Ceci est source de confusion pour moi.

Maintenant, voici la partie difficile: Comment puis-je $ _GET les valeurs de valeur et une autre valeur tout en laissant toutes les autres valeurs d'URL intactes à la fin de page.php? En outre, si un utilisateur visite http://www.example.com/something/dir2/somethingelse/page.php, le contenu sera affiché pour http://www.example.com/dir/dir2/page.php?value=something&anothervalue=somethingelse, et vice versa, n'est-ce pas?

Ceci est très important pour le fonctionnement de mon site, merci d'aider à l'avance! Je ne sais rien du tout .htaccess mais je sais qu'il est possible de le faire. Pour clarifier, faire cette chose très confuse rendra les choses beaucoup plus simples à long terme, car il faudra beaucoup moins de recodage et fournira des URL plus propres.

Répondre

2

Cette règle devrait le faire:

RewriteCond %{REQUEST_URI} !^/dir/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/(.*) dir/$2/$4?value=$1&anothervalue=$3 [L,QSA] 

Il va réécrire les demandes de /something/dir2/somethingelse/page.php interne /dir/dir2/page.php?value=something&anothervalue=somethingelse.

Mais cela n'empêcherait pas de demander directement ce dernier mais juste d'autoriser un alias.

demandes Rediriger de /dir/dir2/page.php?value=something&anothervalue=somethingelse externe à /something/dir2/somethingelse/page.php est également possible avec mod_rewrite mais nécessite un peu de règle plus complexe car les paramètres d'URL peuvent avoir un ordre arbitraire:

RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)value=([^&]+)&?([^&].*)?$ 
RewriteCond %3&%1%4 ^([^&]+)&(([^&]*&)*)anothervalue=([^&]+)&?([^&].*)?$ 
RewriteRule ^dir/([^/]+)/(.*) /%1/$1/%4/$2?%2%5 [L,R=301] 

Comme vous le voyez, ce n'est pas vraiment agréable. Une meilleure solution serait de vérifier avec PHP quelle URL a été demandée (voir $_SERVER['REQUEST_URI']) et de faire la redirection avec PHP (voir header function).

+0

Ok, donc le premier agira comme un masque pour l'URL réelle, et montrera le contenu comme si l'utilisateur avait visité la vraie URL? Je peux toujours $ _GET mes vars, non? Si les deux sont vraies, alors je suis vraiment heureux! Je pense que je voulais une requête interne, ce qui signifie que la page affichée est le contenu de /dir/dir2/page.php?value=something&anothervalue=somethingelse, même si l'URL est /something/dir2/somethingelse/page.php? Serai-je en mesure de $ _GET variables maintenant à partir de la nouvelle URL? Merci beaucoup! – Cyclone

2

Vous avez raison, il est possible de le faire. D'autres peuvent ne pas être d'accord, mais j'ai tendance à penser que la bonne chose au point où vous en êtes est de vous référer à the documentation for mod_rewrite. Si vous voulez maintenir ce complexe d'un ensemble de réécritures, vous aurez besoin d'en apprendre plus tôt ou plus tard, alors c'est peut-être mieux maintenant.

+0

Lol, heureux de savoir que c'est possible. Ill faire un compromis, si je lis la documentation, vous me fournissez le code réel? Merci pour l'aide: D – Cyclone

1

Pour la réécriture spécifique que vous posez ci-dessus, quelque chose comme cela devrait fonctionner:

RewriteEngine On 
RewriteRule ^/(.*)/(.*)/(.*)/(.*)\.php$ /dir/\2/\4.php?value=\1&anothervalue=\3 [L] 

... bien que dans la pratique, je recommande de ne pas utiliser le point jeton comme indiqué, comme il correspondra avec des chemins supplémentaires niveaux en eux et bousiller la réécriture. Le remplacement de chaque point par [^/] pourrait fonctionner, bien que je veuille que quelqu'un qui soit plus doué que moi dans les expressions régulières jette un oeil et détermine s'il y a des pièges là aussi. Quoi qu'il en soit, le point important est que les expressions régulières peuvent être très complexes et très puissantes, et une explication complète d'entre elles est bien au-delà de la portée de cette réponse. Essayez de passer du temps au http://www.regular-expressions.info pour un tutoriel général.

De plus, si un utilisateur visite http://www.example.com/something/dir2/somethingelse/page.php ils seront affichés le contenu de http://www.example.com/dir/dir2/page.php?value=something&anothervalue=somethingelse, et vice versa, à droite?

No; ça ne marche que d'une façon. Pour faire les deux façons, vous auriez besoin de deux RewriteRules.

Je ne suis pas sûr de comprendre votre question sur $ _GET. $ _GET est un tableau rempli de paires clé/valeur pour chacun des paramètres de l'URL; vous pouvez en utiliser autant ou aussi peu que vous le souhaitez. Ce n'est pas destructif - l'utiliser ne modifie pas les paramètres de la chaîne d'URL.

+0

D'accord, merci. Donc, si je devais utiliser le code: $ _GET ['value'] cela retournerait quelque chose même avec la réécriture? – Cyclone

+0

Quelqu'un a vraiment besoin de faire un script Mod_Rewrite en php qui va faire des choses comme ça en soi ..... – Cyclone

+0

Oui, c'est correct. Si vous prenez http://example.com/foo et que vous le réécrivez sur http://example.com/bar=foo, vous pouvez travailler avec la paire clé/valeur que vous avez créée, indépendamment de ce que l'utilisateur voit dans le fichier. barre d'adresse du navigateur. – phenry