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 requirejses en tant que parameters 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 parameters qui apparaissent après / user / friends tels quels. Comment puis-je accomplir cela?

Vous devriez utiliser l’indicateur [QSA] 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 l’utilisation de l’indicateur QSA dans le livre de recettes mod_rewrite .

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

Mais comme l’a déjà dit Chad Birch, il suffit que le drapeau QSA automatiquement ajouté à la nouvelle URL.

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