web-dev-qa-db-fra.com

Redirection des URL "laides" vers les jolies?

Par exemple pour afficher /id/123 pour /urlugly?id=123 je peux le faire

RewriteRule ^id/([^/]*)$ /urlugly?id=$1 [L]

et apparemment pour la redirection, je peux ajouter [R]

RewriteRule ^id/([^/]*)$ /urlugly?id=$1 [R,L]

qui redirige/id/123 to/urlugly? id = 123 comme prévu.

si je voulais rediriger/urlugly? id = 123 à/id/123 je pensais

RewriteRule ^urlugly?id=$ /id/([^/]*)$1  [R]
RewriteRule ^id/([^/]*)$ /urlugly?id=$1 [L]

Cela fonctionnerait ... et j'ai essayé d'autres choses similaires, et je pense que ma logique est correcte, mais ce n'est évidemment pas le cas.

Alors, comment rediriger /urlugly?id=123 vers/id/123? Je n'arrive pas à le faire fonctionner. Je sais (pensez?) [L] signifie "ignorer les autres qui correspondent à cela" et je pense que cela s'applique à ceux qui sont - au-dessous - de cette ligne avec [L]

c'est-à-dire que si je plaçais [R] au dessus, cela fonctionnerait toujours et [L] fonctionnerait aussi ... Est-ce correct?

Qu'est-ce que je fais mal ici et quelle est la bonne approche?

2
S00

Il est difficile de réécrire vos jolies URL sur un gestionnaire tout en redirigeant les URL laides du gestionnaire vers la belle URL. Je devais demander comment faire à StackOverflow .

mod_rewrite effectue plusieurs passages sur vos règles, donc spécifier l'indicateur [L] ne suffit pas. Lorsque vous réécrivez votre jolie URL, vous devez définir une variable d’environnement. Ensuite, lorsque vous décidez de rediriger une URL laide, ne le faites que lorsque la variable d’environnement n’est pas définie (afin d’éviter la redirection lorsqu’elle est laide en raison de votre réécriture.) Lors de la seconde passe lorsque cette redirection est évaluée, les variables d’environnement sont tous préfixés par REDIRECT_. Ainsi, si vous définissez une variable d’environnement LOOP, vous devez la lire sous la forme REDIRECT_LOOP. Voici ce qui devrait fonctionner pour vous:

RewriteEngine On

RewriteRule ^id/([^/]*)$ /urlugly?id=$1 [L,E=LOOP:1]

RewriteCond %{ENV:REDIRECT_LOOP} !1
RewriteCond %{QUERY_STRING} id=(.+)
RewriteRule ^urlugly$ /id/%1 [R,L]
1