2009-05-04 8 views
20

Je cherche à réécrire des URLs avec plusieurs sous-chaînes. Une sous-chaîne est demandée en tant que sous-répertoire, tandis que d'autres sont demandées en tant que paramètres de chaîne de requête normaux.Match Question Mark dans la règle mod_rewrite regex

Par exemple, je voudrais réécrire urls de

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

à

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

Je suis en mesure d'y arriver à 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 caractère, cela fonctionne très bien. Il semble que le problème est que le '?' le caractère est interprété de manière incorrecte comme le début d'une nouvelle chaîne de requête.

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

Répondre

33

Vous devez 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.

Ainsi, 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 à the example given for using the QSA flag in the mod_rewrite cookbook.

+0

Merci pour la réponse. Fonctionne très bien et je lis le livre de cuisine en ce moment. – markb

+0

Supers solution cela a fonctionné pour moi aussi, bien que j'ai édité le code à mes conditions: RewriteRule^([A-Za-z0-9 -_] +) \. Php? pindex.php? typeofpage = $ 1 [QSA, L] –

10

Le query is not part of the URL path and thus cannot be processed with the RewriteRule directive. Cela peut uniquement être effectué avec la directive RewriteCond (voir %{QUERY_STRING}).

Mais il suffit de as Chad Birch already said régler le QSA flag pour obtenir automatiquement la requête originale demandée ajoutée à la nouvelle URL.

+0

QSA a un problème répertorié à l'adresse https://stackoverflow.com/questions/16468098/what-is-l-in-qsa-l-in-htaccess/16468677#comment79837245_16468677 . En outre, rewritecond query_string n'est pas capable de distinguer les requêtes sans chaînes de requête, par opposition aux requêtes avec des chaînes de requête nues (c'est-à-dire un seul point d'interrogation et rien d'autre). Y a-t-il un moyen de distinguer ces deux demandes? – Pacerier

+0

Ok nbm .. Je l'ai trouvé: '$ {the_request}' – Pacerier

1

En plus d'utiliser le QSA de drapeau de réécriture, 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éécrite à (comme spécifié):

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

Cool, '% {QUERY_STRING}' fonctionne. – Pacerier