Htaccess ein Segment der URL in Wordpress ersetzen?

Jul 20 2020

Problem

Ich möchte von umleiten website.com/PRODUCT/name-of-itemzu website.com/COURSES/name-of-item. Es gibt zu viele Produkte, um sie einzeln herzustellen.

Da der Begriff manchmal productin dem name-of-itemTeil 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

2 MrWhite Jul 20 2020 at 04:37

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 WordPressBlock 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 OnAnweisung 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 WordPressund und den # END WordPressKommentaren niemals manuell bearbeiten . Ich gehe davon aus, dass dies auch für die gilt # BEGIN Security Block. Daher sollten Sie wahrscheinlich beide RewriteEngine OnAnweisungen beibehalten (obwohl die erste eigentlich überflüssig ist).

Der Grund, warum Sie mehrere RewriteEngine OnDirektiven in WordPress- .htaccessDateien erhalten, ist, dass Sie möglicherweise mehrere Plugins haben, die alle die .htaccessDatei bearbeiten und ihre eigenen Direktiven einfügen. Jede enthält eine RewriteEngine OnAnweisung, da sie nicht wissen, was sich sonst noch in der .htaccessDatei befindet.

Doch von einer Apache / .htaccess Perspektive nur die sehr letzte Instanz der RewriteEngineRichtlinie etwas tut - und diese steuert die gesamte Datei. Wenn Sie diese Anweisungen also manuell schreiben, haben Sie nur eine RewriteEngine OnAnweisung oben (nur weil dies besser lesbar ist - aber die Reihenfolge spielt keine Rolle).

Sie könnten eine RewriteEngine OffDirektive ganz am Ende der Datei schreiben und dadurch die Rewrite-Engine für die gesamte Datei deaktivieren, obwohl es RewriteEngine Onfrü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 WordPressBlock also noch vorhanden ist (mit seiner RewriteEngine OnDirektive) - den Sie nicht bearbeiten sollten -, müssen Sie die RewriteEngine OnDirektive nicht wiederholen, wenn Sie darüber Ihre eigenen benutzerdefinierten Weiterleitungen erstellen. Das ist alles, was ich anfangs wirklich gesagt habe.

Berto99 Jul 20 2020 at 00:39

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