web-dev-qa-db-fra.com

301 redirections Résultat dans 404 pour les chaînes de requête de recherche WordPress

Je travaille avec un blog qui existe depuis longtemps, mais qui a récemment migré vers WordPress depuis une autre plate-forme. Toutes les anciennes URL sont mappées vers de nouveaux permaliens via des redirections 301 dans .htaccess. La plupart de ces redirections se comportent comme prévu, à l'exception des redirections impliquant des requêtes de recherche. Lors de la redirection d'une requête de recherche de l'ancienne structure de la plate-forme vers la structure WordPress, la redirection ne prend pas effet et l'utilisateur reçoit un 404. Normalement, cela ne devrait pas être une préoccupation majeure, mais Google les explore et en alerte dans le client. console de recherche.

Ainsi, par exemple, cela produit les résultats attendus:

Redirect 301 /p/about-me.html https://www.example.com/about/

Ceci, cependant, ne pas ne redirige et entraîne un 404:

Redirect 301 /search?q=avengers https://www.example.com/?s=avengers

Peut-être que cela a à voir avec la façon dont WordPress gère les chaînes de requête pour les recherches, mais ce n'est pas quelque chose que j'ai vu auparavant.

Des idées?

1
DavidBrown
Redirect 301 /search?q=avengers https://www.example.com/?s=avengers

Vous ne pouvez pas faire correspondre la chaîne de requête à une directive mod_alias Redirect (ou RedirectMatch). La directive Redirect correspond uniquement au chemin URL. Vous devez utiliser mod_rewrite et faire correspondre la variable de serveur QUERY_STRING.

Par exemple:

RewriteCond %{QUERY_STRING} ^q=avengers$
RewriteRule ^search$ /?s=avengers [R=301,L]

Cela devra aller avant le contrôleur frontal WordPress existant.

Le préfixe barre oblique sur le modèle RewriteRule est intentionnellement omis. ^search$ correspond au chemin URL /search dans un contexte .htaccess.

Cependant, étant donné que WordPress utilise déjà mod_rewrite (contrôleur frontal, etc.), vous devriez également utiliser mod_rewrite pour ces redirections, plutôt que mod_alias. Différents modules s'exécutant à différents moments de la demande, vous pouvez ainsi vous retrouver avec des conflits inattendus. (Vous avez probablement constaté que vous pouviez placer les autres directives Redirect n'importe où dans le fichier .htaccess et que cela fonctionnait toujours - cela n’est pas particulièrement intuitif.)


Avez-vous essayé avec RedirectMatch 301?
Non, car je redirige des URL spécifiques, pas des modèles.

Aside : Cet argument ne tient pas la route. Les "modèles" peuvent correspondre à des URL spécifiques (en fait, cela peut être plus facile). La directive mod_rewrite ci-dessus utilise des "modèles" (c'est-à-dire regex) mais correspond uniquement à l'URL exacte spécifiée. En fait, Redirect ne correspond pas "à des URL spécifiques" non plus - il s'agit du préfixe correspondant (segments de chemin d'accès complets), de sorte que vous pouvez trouver qu'une Redirect est en fait correspondant plus que vous ne le pensiez!

1
MrWhite