it-swarm.com.de

Case-specific mod rewrite auf WordPress subdomain multisite

Ich habe ein WordPress -Blog in mehrere kategoriespezifische Blogs unter Verwendung von Subdomains aufgeteilt, da die Themen im ursprünglichen Blog zu weit gefasst waren, um sie effektiv zusammenzufassen.

Beiträge wurden aus dem übergeordneten www Blog exportiert und in die fachspezifischen Subdomain-Blogs importiert.

Ich glaube . Htaccess bietet Mod Rewrite für alle Subdomains (einschließlich des ursprünglichen www) in einem einzigen .htaccess Datei.

Ich verwende . Htaccess , um 301 Weiterleitungen von Post-Kategorien zu dem entsprechenden Post im Blog der Subdomain durchzuführen, z.

RedirectMatch 301 ^/auto/(.*)$ http://auto.example.com/$1

Das Problem, das ich habe, ist, dass die Kategorie in der Permalink-Struktur im Subdomain-Blog beibehalten wurde, sodass www.example.com/auto/mercedes jetzt auto.example.com/auto/mercedes ist.

Die 1. URL wird auf die 2. URL umgeleitet, aber leider wird die 2. URL unter Verwendung derselben Umschreiberegel, die nicht gefunden wird, auf auto.example.com/mercedes umgeleitet, da der Permalink im Blog der Subdomain die übergeordnete Kategorie von auto beibehält.

Die Lösung wäre, die Permalink-Struktur in den WP -Einstellungen der Subdomain anzupassen, damit die Top-Level-Kategorie die Subdomain nicht dupliziert.

Meine Frage wäre: Wie entferne ich dann beim Umleiten einen Abschnitt der ursprünglichen (www) Blog-Beitrags-URL von der URL der Subdomain? Beispiel: Wie leite ich www.example.com/auto/mercedes zu auto.example.com/mercedes um?

Ich gehe davon aus, dass dies ein Trick mit regulären Ausdrücken ist, in dem ich nicht besonders gut bin.

pdate: Möglicherweise muss ich verwenden:

RewriteCond %{HTTP_Host} !auto.example.com$

In der Standardeinstellung WordPress if loop in . Htaccess , und trennen Sie meine benutzerdefinierten Subdomain-Umleitungen in einen zweiten if loop-Abschnitt.

4
Steve

Wow, das ist eine ziemlich komplizierte Antwort . So würde ich es in einem .htaccess Kontext machen:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_Host} =example.com     [NC,OR]
RewriteCond %{HTTP_Host} =www.example.com [NC]
RewriteRule ^(auto|foo|bar)/(.*)$ http://$1.example.com/$1/$2 [NS,L,R=301]

Die RewriteConds stellen sicher, dass diese Regel nur für example.com und www.example.com angewendet wird, nicht für andere Sites. Sie können die erste RewriteCond entfernen, wenn Sie nur möchten, dass die Regel auf www.example.com angewendet wird.

Die RewriteRule leitet dann z. www.example.com/auto/mercedes bis auto.example.com/auto/mercedes. (Wenn Sie möchten, dass es nur zu auto.example.com/mercedes umleitet, ersetzen Sie $1/$2 durch $2.) Das gleiche gilt auch für die Kategorien foo und bar ; Sie können beliebig viele Kategorien hinzufügen, indem Sie einfach den regulären Ausdruck bearbeiten.

1
Ilmari Karonen

In zehn Zeilen haben Sie nicht nur das, wonach Sie gefragt haben, sondern auch einen großen Vorteil: Wenn Sie einen Betreff hinzufügen möchten, beispielsweise "newsubject", fügen Sie einfach eine Zeile in Ihre Kartendatei ein:

newsubject newsubject

erstellen Sie die Hash-Datei neu, starten Sie den Server neu und los geht's!


Also hier ist die "komprimierte" Version:

 RewriteMap mapsubdomains \
   dbm:/web/htdocs/mysite/rewriterules/mapsubdomains.map
 RewriteCond %{HTTP_Host} (([a-zA-Z0-9\-]+)\.)([a-zA-Z0-9\-]+)\.com$
 RewriteRule (.*) - [QSA,E=PART1:${mapsubdomains:%1|notfound}]
 RewriteCond %{ENV:PART1} ^$ [OR]
 RewriteCond %{ENV:PART1} notfound
 RewriteRule ^/([a-zA-Z]+)/(.*)$ - [QSA,E=SUBJECT:${mapsubdomains:%1|notfound}]
 RewriteCond %{ENV:SUBJECT} !^$
 RewriteCond %{ENV:SUBJECT} !(notfound)
 RewriteRule ^/([a-zA-Z]+)/(.*)$ http://%{ENV:SUBJECT}.mysite.com/$2 [QSA,L]

Ausführliche Antwort:

(1) Verwenden Sie eine Map-Datei, in der Sie einfache Dinge wie diese schreiben:

auto    auto
moto    moto

nehmen Sie es dann in Ihre Umschreiberegel auf:

 RewriteMap mapsubdomains \
   dbm:/web/htdocs/mysite/rewriterules/mapsubdomains.map

dann mache eine generische Regel:

 RewriteCond %{HTTP_Host} (([a-zA-Z0-9\-]+)\.)([a-zA-Z0-9\-]+)\.com$
 RewriteRule (.*) - [QSA,E=PART1:${mapsubdomains:%1|notfound}]

Die vorherige Regel bedeutet: Wenn der Host zwei Teile hat (z. B. http://part1.part2.com), dann schauen Sie in die Kartensubdomäne und füllen Sie sie mit dem richtigen Wert oder "notfound", falls nicht gefunden.

Wenn "notfound" bedeutet dies, dass Sie nach der URL suchen können:

 # if PART1 empty:
 RewriteCond %{ENV:PART1} ^$ [OR]
 # ...or PART1 not found:
 RewriteCond %{ENV:PART1} notfound
 # ...then lookup: 
 RewriteRule ^/([a-zA-Z]+)/(.*)$ - [QSA,E=SUBJECT:${mapsubdomains:%1|notfound}]

 # if subject not empty, and is found then redirect:
 RewriteCond %{ENV:SUBJECT} !^$
 RewriteCond %{ENV:SUBJECT} !(notfound)
 RewriteRule ^/([a-zA-Z]+)/(.*)$ http://%{ENV:SUBJECT}.mysite.com/$2 [QSA,L]
1
Olivier Pons