2010-08-27 6 views
0

Je sais que quelque chose est en conflit mais étant un mod réécrire Moldu il est temps de demander de l'aide.apache réécrire le conflit

Je réécrivant http://test.com/[name]/
à http://test.com/script.php?id=[name]
avec succès, en utilisant:

(rule#1) 
RewriteRule ^(.*)\/$ script.php?id=$1&%{QUERY_STRING} [L] 

Ensuite, je récrire http://test.com/[name]/foobar/[key]
à http://test.com/script.php?id=[name]&foobar=[key]
aussi avec succès, en utilisant:

(rule#2) 
RewriteRule ^(.*)\/foobar/([0-9]+)$ script.php?id=$1&foobar=$2 [L] 

Ho Wever, lorsque je tente d'inclure les chaînes de requête, de sorte que
http://test.com/[name]/foobar/[key]?p=[page]
pourrait être réécrite à http://test.com/script.php?id=[name]&foobar=[key]&p=[page]
avec ceci:

(rule#3) 
RewriteRule ^(.*)\/foobar/([0-9]+)$ script.php?id=$1&foobar=$2&%{QUERY_STRING} [L] 

alors Apache me jette tout juste à http://test.com/script.php.

Je sais tâtonnement que la règle # 3 fonctionnerait si elle n'a pas utilisé la même script.php que la règle n ° 1, mais
je ne sais pas comment le résoudre, de sorte que toute aide appréciée! Après avoir revérifié mes règles avec les exemples de Gumbo, j'ai finalement découvert ce qui n'allait pas. Bien que pas parfait, mes règles de réécriture fonctionnaient comme prévu. Cependant, j'oublie totalement que j'ai eu un autre script qui vérifie les paramètres valides ... apparemment, en jetant des valeurs de test aléatoires, ce n'est parfois pas une bonne idée. Merci pour le truc/^ si!

Répondre

0

Avertissement: vous utilisez .*, qui ne peut correspondre à rien. Utilisez .+ sauf si vous avez l'intention de ne rien trouver.

Avez-vous déjà réuni toutes vos règles ici? Y a-t-il des erreurs dans votre error_log à ce sujet?

2

Utilisez [^/]+ pour correspondre à seulement un ou plusieurs caractères arbitraires sauf / au lieu de .* un certain nombre de caractères arbitraires:

RewriteRule ^([^/]+)/$ script.php?id=$1&%{QUERY_STRING} [L] 
RewriteRule ^([^/]+)/foobar/([0-9]+)$ script.php?id=$1&foobar=$2 [L] 

De plus, vous pouvez définir le QSA drapeau pour avoir la requête demandée originale automatiquement en annexe à la nouvelle URL au lieu de l'ajouter manuellement:

RewriteRule ^([^/]+)/$ script.php?id=$1 [L,QSA]