Question Faire correspondre le point d'interrogation dans l'expression regex de la règle mod_rewrite


Je cherche à réécrire les URL avec plusieurs sous-chaînes. Une sous-chaîne est demandée en tant que sous-répertoire, tandis que d'autres sont requises en tant que paramètres de chaîne de requête normaux.

Par exemple, je voudrais réécrire les URL de

http://www.mysite.com/mark/friends?page=2

à

http://www.mysite.com/friends.php?user=mark&page=2

Je suis capable d'accomplir cela à l'exception du caractère de point d'interrogation. Voici ma règle de réécriture:

...
RewriteEngine On
RewriteBase /
RewriteRule ^([A-Za-z0-9-_]+)/friends[?]?([^/\.]+)?$ friends.php?user=$1&$2 [L]

Si je change le point d'interrogation en un autre personnage, cela fonctionne très bien. Il semble que le problème est que le "?" Le caractère est interprété incorrectement comme le début d'une nouvelle chaîne de requête.

Je dois transmettre les paramètres qui apparaissent après / user / friends tels quels. Comment puis-je accomplir cela?


20
2018-05-04 22:32


origine


Réponses:


Vous devriez utiliser le [QSA] flag au lieu d'essayer de réécrire la chaîne de requête. [QSA] transmet la chaîne de requête à l'URL réécrite.

Donc, votre règle devrait ressembler à:

...
RewriteEngine On
RewriteBase /
RewriteRule ^([A-Za-z0-9-_]+)/friends/? friends.php?user=$1 [QSA,L]

Votre cas est très similaire à l'exemple donné pour utiliser le drapeau QSA dans le livre de recettes mod_rewrite.


33
2018-05-04 22:36



le requête ne fait pas partie du chemin de l’URL et ne peut donc pas être traitée avec le RewriteRule directif. Cela ne peut être fait qu'avec le RewriteCond directive (voir %{QUERY_STRING}).

Mais comme l'a déjà dit Chad Birch il suffit de mettre le QSA drapeau pour obtenir automatiquement la requête originale demandée ajoutée à la nouvelle URL.


10
2018-05-04 22:44



En plus d'utiliser l'indicateur de réécriture QSA, vous pouvez également utiliser la variable d'environnement QUERY_STRING comme indiqué ci-dessous:

RewriteEngine On
RewriteBase /
RewriteRule ^([A-Za-z0-9-_]+)/friends$ /friends.php?user=$1&%{QUERY_STRING}

Et l'URL en question

http://www.example.com/mark/friends?page=2

sera réécrit à (comme spécifié):

http://www.example.com/friends.php?user=mark&page=2

1
2018-05-23 11:45