web-dev-qa-db-fra.com

La directive Redirect 301 pour Apache n'a aucun effet sur les URL avec une chaîne de requête

J'ai cet ancien lien http://www.example.com/?page_id=617/ que je veux rediriger vers la page d'accueil. J'ai essayé d'implémenter cette redirection avec:

Redirect 301 /?page_id=617/ https://www.example.com/

Après avoir appliqué ce changement, rien ne s'est passé. L'ancienne URL ne redirige pas.

4
user6744479

Vous ne pouvez pas faire correspondre la chaîne de requête avec un mod_alias Redirect. Vous devez plutôt utiliser une directive mod_rewrite RewriteRule. Et comparez-les avec la variable de serveur QUERY_STRING dans une directive RewriteCond.

Essayez plutôt ce qui suit, en haut du fichier .htaccess:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^page_id=617/$
RewriteRule ^$ https://www.example.com/? [R=302,L]

Notez que cela correspond à la chaîne de requête exacte?page_id=617/. Modifiez le motif en ^page_id=617 pour qu'il corresponde à une chaîne de requête qui simplement démarre?page_id=617.

Ne changez le 302 au 301 que si vous êtes certain que tout fonctionne correctement. (Pour éviter que des redirections erronées ne soient mises en cache par le navigateur.)

Le ? à la fin de la RewriteRulesubstitution est requis pour supprimer la chaîne de requête de la demande (sinon, elle est transmise à l'URL cible). Sur Apache 2.4+, vous pouvez utiliser le drapeau QSD à la place.

4
MrWhite