Je dois redirect quelques URI ayant une chaîne de requête comme:
/pages/foo.bar?pageId=123456
à http://some.site/spam/egg/
/pages/foo.bar?pageId=45678
pour http://another.site/spaming/egging/
J’ai ceci dans mon htaccess:
RewriteEngine On RewriteCond %{REQUEST_URI} ^/pages/foo.bar$ RewriteCond %{QUERY_STRING} ^pageId=123456$ RewriteRule ^.*$ http://some.site/spam/egg/ [R=301,L] RewriteCond %{REQUEST_URI} ^/pages/foo.bar$ RewriteCond %{QUERY_STRING} ^pageId=45678$ RewriteRule ^.*$ http://another.site/spaming/egging/ [R=301,L]
Mais ça ne marche pas, montrant 404. Qu’est-ce que je fais mal?
Vous devez déplacer ces 2 règles, c’est-à-dire avant toutes les autres règles situées juste en dessous de RewriteEngine On
line, car d’autres règles risquent d’ignorer cette règle.
(Basé sur vos commentaires) Votre règle coupable est cette règle:
RewriteRule . index.php [L]
Qui est en train de réécrire chaque requête à index.php
et changer la valeur de la variable REQUEST_URI
en /index.php
, provoquant ainsi l’échec de cette condition:
RewriteCond %{REQUEST_URI} ^/pages/foo.bar$
De votre exemple, vous êtes redirigé vers
http://some.site/spam/egg/?pageId=123456 http://another.site/spaming/egging/?pageId=45678
Vous pouvez utiliser les outils de développement de votre navigateur pour afficher la redirection (dans l’onglet Réseau).
Peut-être que les chaînes de requête dans l’URL redirigée conduisent à un 404? Vous pouvez append un ?
à la fin de votre redirection, effacez la chaîne de requête:
RewriteCond %{REQUEST_URI} ^/pages/foo.bar$ RewriteCond %{QUERY_STRING} ^pageId=45678$ RewriteRule ^.*$ http://another.site/spaming/egging/? [R=301,L]