web-dev-qa-db-fra.com

Comment rediriger des pages avec une chaîne de requête?

Je veux Redirect comme on le voit ci-dessous:

https://example.com/p1/p2?sort=p.model&order=ASC&page=2

à

https://example.com/p3/p4?sort=p.model&order=ASC&page=2

De plus, j'ai ce code dans mon fichier .htaccess:

RedirectMatch 410 ^/p1/p2&

J'ai utilisé le code ci-dessous, mais je viens de voir 410 code pour cette URL:

RewriteRule ^/p1/p2?sort=p.model&order=ASC&page=2$ /p3/p4?sort=p.model&order=ASC&page=2 [QSD, R=301,L]

Donc, j'ai changé RedirectMatch 410 ^/p1/p2& en Redirect 410 ^/p1/p2&, mais cette fois j'ai vu 404 Code pour mon Request URI.
Que devrais-je faire?

3
Pasakgroup

Essayez plutôt le suivant, en remplaçant votre directive RedirectMatch existante:

RewriteEngine On

# Redirect "/p1/p2?sort=p.model&order=ASC&page=2" and keep query string
RewriteCond %{QUERY_STRING} ^sort=p\.model&order=ASC&page=2$
RewriteRule ^p1/p2$ /p3/p4 [R=302,L]

# Reject all requests that start "/p1/p2&" with 410 Gone
RewriteRule ^p1/p2& - [G]

Vous n'avez pas besoin de répéter la chaîne de requête dans la RewriteRulesubstitution (c.-à-d. /p3/p4), car la chaîne de requête de l'URL demandée sera transmise par défaut sans modification (à condition que vous ne définissiez pas explicitement une chaîne de requête sur le substitution vous-même).

Notez qu'il s'agit d'une redirection 302 (temporaire). Changez à 301 si cela doit être permanent, mais seulement une fois que vous avez confirmé que tout fonctionne correctement. Effacez le cache de votre navigateur avant de le tester.

J'ai utilisé le code ci-dessous, mais je ne vois que le code 410 pour cette URL

La raison pour laquelle vous voyez une réponse de 410 n'est pas claire à moins que "quelque chose d'autre" ne déclenche cette réaction. Votre directive RedirectMatch existante n'aurait pas dû correspondre.

Cependant, il est conseillé de ne pas mélanger mod_alias (RedirectMatch et Redirect) avec les directives mod_rewrite (RewriteRule) car vous pouvez obtenir des conflits inattendus. Différents modules s'exécutent indépendamment et à des moments différents au cours de la requête. Ainsi, vous pouvez constater qu'une directive RedirectMatch (ou Redirect) est toujours traitée, même si une directive précédente RewriteRule a réécrit la demande.

RewriteRule ^/p1/p2?sort=p.model&order=ASC&page=2$ /p3/p4?sort=p.model&order=ASC&page=2 [QSD, R=301,L]

Cela ne fera réellement rien. Cette directive pose un certain nombre de problèmes (par ordre de gravité):

  • La RewriteRulemotif correspond uniquement au chemin URL, ce qui exclut notamment la chaîne de requête. Donc, ce motif ne correspondra jamais. (Pour correspondre à la chaîne de requête, vous devez utiliser une directive RewriteCond et vérifier la variable de serveur QUERY_STRING, comme indiqué ci-dessus).
  • Vous avez un espace au milieu de l'argument flags. Cela entraînerait une erreur de 500 serveur interne si elle est traitée ("indicateurs non valides").
  • L'indicateur QSD (Query String Discard) est redondant.
  • Inutile de répéter la même chaîne de requête dans le substitution (c'est-à-dire l'URL cible), car celle-ci serait copiée telle quelle à partir de l'URL demandée par défaut.

Donc, j'ai changé RedirectMatch 410 ^/p1/p2& en Redirect 410 ^/p1/p2&, mais cette fois j'ai vu le code 404 pour mon URI de demande.

Redirect 410 ^/p1/p2& ne ferait rien car la directive Redirect n'accepte pas les expressions rationnelles, contrairement à la directive RedirectMatch. Mais, comme indiqué ci-dessus, ces directives appartiennent de toute façon au même module (mod_alias). Par conséquent, le remplacer par Redirect ne sert à rien dans ce cas.

Vous obteniez probablement un 404 parce que "rien" ne se passait.

1
MrWhite