web-dev-qa-db-fra.com

Comment puis-je faire correspondre les variables de chaîne de requête avec mod_rewrite?

Supposons que j'ai des URL avec des paramètres de chaîne de requête comme ceux-ci:

/index.php?book=DesignPatterns&page=139
/index.php?book=Refactoring&page=285

En utilisant mod_rewrite , comment puis-je les rediriger vers des URL SES comme celles-ci?

/DesignPatterns/139
/Refactoring/285
48
Patrick McElhaney
RewriteCond %{QUERY_STRING} book=(\w+)&page=(\d+)  
RewriteRule ^index.php /%1/%2? [L,R=301]

Parce que RewriteRule ne regarde que le chemin (jusqu'au point d'interrogation, mais non compris), utilisez RewriteCond pour capturer les valeurs dans la chaîne de requête.

Notez que les correspondances de RewriteCond sont capturées dans %1, %2, etc., plutôt que $1, $2, etc.

Notez également le ? à la fin de RewriteRule. Il dit à mod_rewrite de ne pas ajouter la chaîne de requête d'origine à la nouvelle URL, donc vous vous retrouvez avec /DesignPatterns/151 au lieu de /DesignPatterns/151?book=DesignPatterns&page=151.

Le [L,R=301] les drapeaux font deux choses:

  1. L garantit qu'aucune autre règle qui pourrait correspondre autrement ne sera traitée (en d'autres termes, elle garantit qu'il s'agit de la "dernière" règle traitée).
  2. R=301 oblige le serveur à renvoyer une réponse de redirection. Au lieu de réécrire, il indique au client de réessayer avec la nouvelle URL. Le =301 en fait une redirection permanente , afin que, entre autres, les moteurs de recherche sachent remplacer l'ancienne URL par la nouvelle URL dans leurs index.
101
Patrick McElhaney