La redirection ne fonctionne pas avec mod_rewrite dans htaccess

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]