Htaccess ein Segment der URL in Wordpress ersetzen?
Problem
Ich möchte von umleiten website.com/PRODUCT/name-of-item
zu website.com/COURSES/name-of-item
. Es gibt zu viele Produkte, um sie einzeln herzustellen.
Da der Begriff manchmal product
in dem name-of-item
Teil vorkommt (z. B. product-best-rating
), muss ich mir dessen bewusst sein.
Viele Benutzer haben ähnliche Fragen gestellt. Ich habe die Lösungen ausprobiert und sie funktionieren bei mir nicht.
Was ich versucht habe - Lösung 1
Lösung 1: Schreiben Sie nur den mittleren Teil von URL - mod neu. Schreiben Sie .htaccess neu
Mein Code für Lösung 1 lautet:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] RewriteRule ^product/(.*)$ /courses/$1 [R=302,NE,L]
</IfModule>
# END WordPress
Ergebnisse: https://website.com/product/normal-product/ leitet immer noch weiter https://website.com/product/normal-product/
Was ich versucht habe - Lösung 2
Lösung 2: https://webmasters.stackexchange.com/questions/102402/how-to-bulk-redirect-urls-and-replace-one-path-segment
Für Lösung 2 wäre mein Code folgender:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteRule ^/?product/(.*)$ https://website.com/courses/$1 [R=301,L]
</IfModule>
# END WordPress
Ergebnisse: https://website.com/product/normal-product/ leitet immer noch weiter https://website.com/product/normal-product/
Antworten
Ich habe es überprüft und sehe nichts, was widersprüchlich ist.
Der WordPress-Frontcontroller selbst widerspricht der Weiterleitung. Wenn Sie Ihre Direktive nach den WP-Direktiven platzieren, wird sie einfach nie verarbeitet.
Sie müssen Ihre Weiterleitung (die Direktive aus Lösung 1 oder 2 sieht gut aus) vor dem WordPress-Frontcontroller platzieren. In der Tat sollten Sie es vor dem # BEGIN WordPress
Block platzieren (in der Nähe des Dateianfangs), da WordPress versucht, diesen Teil des Codes beizubehalten und alle benutzerdefinierten Anweisungen zu überschreiben.
Zum Beispiel:
RewriteRule ^product/(.*) /courses/$1 [R=302,NE,L]
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
:
Sie müssen die RewriteEngine On
Anweisung nicht wiederholen .
Das Nachlaufen $
des RewriteRule
Musters ist überflüssig, da Regex standardmäßig gierig ist.
UPDATE: Wenn Sie sagten "Sie müssen RewriteEngine On nicht wiederholen", meinen Sie damit, dass ich A entfernen kann, oder meinen Sie B in diesem Diagramm ...
Mit WordPress sollten Sie vermeiden, den Code in einem Abschnitt, der von WordPress (oder einem Plugin) verwaltet wird, manuell zu bearbeiten. Wenn Sie diesen Code bearbeiten, wird er wahrscheinlich später (von WordPress) überschrieben.
Aus diesem Grund sollten Sie den Code zwischen den Markierungen # BEGIN WordPress
und und den # END WordPress
Kommentaren niemals manuell bearbeiten . Ich gehe davon aus, dass dies auch für die gilt # BEGIN Security Block
. Daher sollten Sie wahrscheinlich beide RewriteEngine On
Anweisungen beibehalten (obwohl die erste eigentlich überflüssig ist).
Der Grund, warum Sie mehrere RewriteEngine On
Direktiven in WordPress- .htaccess
Dateien erhalten, ist, dass Sie möglicherweise mehrere Plugins haben, die alle die .htaccess
Datei bearbeiten und ihre eigenen Direktiven einfügen. Jede enthält eine RewriteEngine On
Anweisung, da sie nicht wissen, was sich sonst noch in der .htaccess
Datei befindet.
Doch von einer Apache / .htaccess Perspektive nur die sehr letzte Instanz der RewriteEngine
Richtlinie etwas tut - und diese steuert die gesamte Datei. Wenn Sie diese Anweisungen also manuell schreiben, haben Sie nur eine RewriteEngine On
Anweisung oben (nur weil dies besser lesbar ist - aber die Reihenfolge spielt keine Rolle).
Sie könnten eine RewriteEngine Off
Direktive ganz am Ende der Datei schreiben und dadurch die Rewrite-Engine für die gesamte Datei deaktivieren, obwohl es RewriteEngine On
früher in der Datei Direktiven gibt - diese werden im Wesentlichen ignoriert. Dies ist eigentlich eine schnelle Möglichkeit, alle mod_rewrite-Direktiven zu "kommentieren", anstatt sie manuell #
vor jeder Direktive zu verwenden.
Wenn der # BEGIN WordPress
Block also noch vorhanden ist (mit seiner RewriteEngine On
Direktive) - den Sie nicht bearbeiten sollten -, müssen Sie die RewriteEngine On
Direktive nicht wiederholen, wenn Sie darüber Ihre eigenen benutzerdefinierten Weiterleitungen erstellen. Das ist alles, was ich anfangs wirklich gesagt habe.
Bitte versuchen Sie Folgendes:
RewriteEngine on
RewriteRule ^/?product/(.*)$ /courses/$1 [R=302,NE,L]
Ich habe hier und diese URL getestet
https://website.com/product/name-of-item
leitet weiter zu
https://website.com/courses/name-of-item