it-swarm.com.de

301 Umleitungen führen zu 404 für WordPress Search Query Strings

Ich arbeite mit einem Blog, der schon lange existiert, aber kürzlich von einer anderen Plattform auf WordPress migriert wurde. Alle alten URLs werden über 301 Weiterleitungen in .htaccess neuen Permalinks zugeordnet. Die meisten dieser Weiterleitungen verhalten sich wie erwartet, mit Ausnahme von Weiterleitungen, die Suchanfragen beinhalten. Wenn eine Suchanfrage von der alten Plattformstruktur zu der WordPress-Struktur umgeleitet wird, wird die Umleitung nicht wirksam, und der Benutzer erhält eine 404. Normalerweise ist dies kein großes Problem, aber Google durchsucht diese und benachrichtigt den Kunden Suchkonsole.

Dies führt beispielsweise zu erwarteten Ergebnissen:

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

Dies leitet jedoch nicht weiter und führt zu einem 404:

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

Vielleicht hat dies speziell damit zu tun, wie WordPress die Abfragezeichenfolgen für Suchvorgänge verarbeitet, aber das habe ich vorher noch nicht gesehen.

Ideen?

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

Sie können die Abfragezeichenfolge nicht mit einer mod_alias-Anweisung Redirect (oder RedirectMatch) abgleichen. Die Anweisung Redirect stimmt nur mit dem URL-Pfad überein. Sie müssen mod_rewrite verwenden und mit der Servervariablen QUERY_STRING abgleichen.

Zum Beispiel:

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

Dies muss vor dem vorhandenen WordPress-Front-Controller erfolgen.

Das Schrägstrich-Präfix für das Muster RewriteRule wurde absichtlich weggelassen. ^search$ stimmt mit dem URL-Pfad /search in einem .htaccess-Kontext überein.

Da WordPress jedoch bereits mod_rewrite (Front-Controller usw.) verwendet, sollten Sie auch für diese Weiterleitungen mod_rewrite anstelle von mod_alias verwenden. Verschiedene Module werden während der Anforderung zu unterschiedlichen Zeiten ausgeführt, sodass unerwartete Konflikte auftreten können. (Sie haben wahrscheinlich festgestellt, dass Sie die anderen Redirect-Direktiven an einer beliebigen Stelle in der .htaccess-Datei platzieren können, und es hat immer noch "funktioniert" - dies ist nicht besonders intuitiv.)


Hast du es mit RedirectMatch 301 versucht?
Nein, ich leite bestimmte URLs um, nicht Muster.

Nebenbei : Dieses Argument ist nicht ganz haltbar. "Muster" können mit bestimmten URLs übereinstimmen (in der Tat kann es einfacher sein, dies zu tun). Die obige mod_rewrite-Direktive verwendet "patterns" (dh Regex), stimmt jedoch nur mit der von Ihnen angegebenen URL überein. Tatsächlich stimmt Redirect auch nicht mit "bestimmten URLs" überein - es handelt sich um übereinstimmende Präfixe (ganze Pfadsegmente), sodass Sie feststellen können, dass eine Redirect tatsächlich ist mehr als Sie dachten!

1
MrWhite