web-dev-qa-db-fra.com

La réécriture .htaccess avec% dans la chaîne de requête ne fonctionne pas

J'essaie de réécrire le site à partir de

http://www.example.com/folder/site?data%5Bbranch%5D=xyz

à

http://www.example2.com/test/

Vous avez déjà essayé la chaîne de requête mais rencontrez des problèmes avec %. De l'aide?

2
Kevin

Notez que si vous devez faire correspondre la chaîne de requête, vous devez comparer la variable de serveur QUERY_STRING dans une directive mod_rewrite RewriteCond. Vous ne pouvez pas faire correspondre la chaîne de requête en utilisant un mod_alias Redirect (ou RedirectMatch) ou le RewriteRule (mod_rewrite) motif - tous ces éléments correspondent à l'URL -path uniquement, ce qui exclut notamment la chaîne de requête.

Sinon, il n'y a rien de spécial à propos de % dans la chaîne de requête. Il correspond à un littéral % dans la variable de serveur QUERY_STRING (qui est non décodé ). Essayez ce qui suit:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^data%5Bbranch%5D=xyz$
RewriteRule ^folder/site$ http://www.example2.com/test/? [R=302,L]

Il est plus efficace de faire correspondre le chemin d'URL dans la variable RewriteRulemotif, plutôt que d'utiliser une condition de correspondance avec REQUEST_URI. La RewriteRulemotif est d'abord mise en correspondance et les conditions (au-dessus de celle-ci) sont traitées.

Pas besoin de mettre la valeur de la chaîne de requête entre guillemets. Toutefois, si vous souhaitez uniquement faire correspondre cette chaîne de requête, vous aurez besoin d'ancres de début/fin (c'est-à-dire ^...$). (Vous pouvez également utiliser le préfixe exact d'égalité lexicographiquement identique, =, c'est-à-dire =data%5Bbranch%5D=xyz. Tout ce qui suit le préfixe = est traité comme une chaîne littérale et non comme une expression régulière).

Le ? est requis à la fin de la substitution RewriteRule afin de supprimer la chaîne de requête de la demande, sinon elle sera transmise à l'URL substituée. En terminant l'URL avec ?, vous créez essentiellement une chaîne de requête vide (le ? lui-même n'est pas inclus dans l'URL résultante). (Si vous utilisez Apache 2.4+, vous pouvez utiliser plutôt le drapeau QSD - Query String Discard -.)

L'indicateur L s'assure qu'aucune autre règle n'est traitée si cela réussit. Ce qui correspond généralement à ce que vous souhaitez faire dans le cas d’une redirection externe.

S'il s'agit d'une redirection permanente, remplacez l'indicateur R=302 (temporaire) par R=301 une fois que tout fonctionne correctement. Si vous n'utilisez pas explicitement l'indicateur R pour forcer une redirection externe, celle-ci sera implicitement redirigée, car vous avez spécifié une URL absolute dans la substitution. Il vaut toujours mieux être explicite. (NB: les redirections 301/permanentes sont mises en cache par le navigateur, il est donc souvent plus facile/sûr de tester en premier avec les redirections 302/temp. Ou les tests avec la mise en cache du navigateur désactivée.)

5
MrWhite

On dirait que j'ai trouvé une réponse à ma propre question. Je suppose que c'est la bonne façon de le faire, mais quand même:

RewriteCond %{REQUEST_URI}  ^/folder/site$
RewriteCond %{QUERY_STRING} "data%5Bbranch%5D=xyz"
RewriteRule (.*) http://www.example2.com/test/
1
Kevin