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?
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 RewriteRule
substitution (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é):
RewriteRule
motif 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).QSD
(Query String Discard) est redondant.Donc, j'ai changé
RedirectMatch 410 ^/p1/p2&
enRedirect 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.