WordPress Multisite: (Sub-)Domains und Sub-Directories kombinieren

WordPress-Multisite ist inzwischen zu einem sehr flexiblen Feature gereift, wenn es um die Verwaltung mehrerer Websites geht. Zwar wird man beim Setup immer noch vor die Entscheidung Subdomain/Sub-Directory gestellt, aber die Entscheidung hat nur temporäre Auswirkung – zumindest wenn man sich für Subdomains entscheidet. Wenn nicht wirklich gute Gründe dagegen sprechen, sollte man sich für die Subdomain-Variante entscheiden. Anschließend kann man direkt loslegen Sites mit komplett unterschiedlichen Domains zu erstellen, ganz ohne Domain-Mapping Plugin.

Mit ein paar Handgriffen sind dann auch folgende Setups möglich:

  • projekt.de/
  • projekt.de/en/
  • projekt.ch/
  • projekt.ch/fr/
  • www.komplett-anderes-projekt.eu/

Über jede dieser (Beispiel-)URIs erreicht man ein separates WordPress-Blog mit separatem Inhalt, Benutzern und Einstellungen – Multisite eben. Dafür macht man sich die Tatsache zu nutze, dass WordPress einem gestattet, sowohl die Domain, als auch den Pfad für jede Site zu bestimmen – allerdings erst, nachdem die Site angelegt ist.

wp-edit-site-path-and-domain

Domain und Pfad können beliebig eingestellt werden. (WordPress bis Version 4.2) Nachtrag: Seit WordPress 4.3 existiert nur noch ein Feld für die komplette URL, was auch wesentlich sinnvoller ist.

Wie schon erwähnt ist der Ausgangspunkt eine Multisite »Subdomain«-Installation. Einer der wesentlichen Unterschiede zur zweiten Variante, den Subdirectories, sind die Rewrite-Rules in der .htaccess.  Normalerweise erlauben diese es nicht, einen URI wie z.B. projekt.de/en/ zu verwenden, denn ein Request auf projekt.de/en/wp-admin/ muss intern auf das Verzeichnis /wp-admin umgeleitet werden. Um das zu bewerkstelligen passt man die .htaccess an und bedient sich einfach der Regeln die sonst für die »Sub-Directory« Installation verwendet würden:

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

Damit hat man die Möglichkeit, eine »Verzeichnisebene« als Pfad für eine Site zu definieren. (URIs wie projekt.de/foo/en/ sind damit noch nicht möglich – prinzipiell geht das aber auch.) Jetzt fehlen noch ein paar Konstanten in der wp-config.php die die Cookie-Pfade und Domains anpassen. Außerdem ist die Konstante NOBLOGREDIRECT hilfreich, wenn man die Registrierung deaktiviert hat.

define( 'SITECOOKIEPATH', '/' );
define( 'ADMIN_COOKIE_PATH' '/' );
define( 'COOKIE_DOMAIN', '' );
define( 'NOBLOGREDIRECT', '%siteurl%' );

Zunächst war ich skeptisch, ob das nicht ein Sicherheitsrisiko wäre, da so das Admin-Cookie nicht nur an die URLs des Backends gesendet würde, aber der WordPress-Core handhabt es derzeit genau so. Ist die Konstante nicht gesetzt, setzt WordPress den Wert auf den Pfad der aktuellen Site – zumindest für »Sub-Directory« Setups.

Beschränkungen und Anwendungsfälle

Will man ein solches Setup verwenden muss man sich natürlich darüber im Klaren sein, dass WordPress eine URI zuerst auf eine Site (ein Blog) routet und erst dann innerhalb des Blogs die Routes anwendet. Hat man also eine Site projekt.de/ (1) und projekt.de/en/ (2) wird man eine auf der Deutschen Site (1) keine Seite (page) mit dem URI-Slug en anlegen wollen, da diese nie aufgerufen werden kann. Jede URI die mit projekt.de/en/ beginnt wird immer die Site 2 initialisieren. WordPress bietet hier auch keine Mechanismen die ein Feedback bei auftretenden Kollisionen geben würden. Mir ist bis jetzt auch kein Plugin bekannt, welches diese bieten würde.

Sinnvoll sind solche Setups unter anderem dann, wenn man mehrere Sprachen und Regionen mit unterschiedlichen Inhalten bedienen möchte: z.B. für die Französischsprachige Schweiz (projekt.ch/fr/) und Frankreich (projekt.fr/).

Kommentare

  1. 01) 30.07.2015
    Ria

    Hallo,
    ich habe eine frische 4.2.3 WP Installation, ohne jegliche (aktive)Plugins. Im Netzwerk Einrichtungsfenster erscheint KEINE Auswahlmöglichkeit(die beiden Wahl-Knöpfe) ob Subfolder oder Subdomain. Auch wenn ich in meiner Hosts Datei entspr. anpasse nicht.
    Ich habe allerdings keine Lust auf dem Heim PC eine Wildcard DNS zu konfigurieren.
    Wurde das inzwischen so geändert, dass man Subdomains so nicht mehr wählen kann?

    mfG Ria

  2. 02) 30.07.2015
    David

    Moin moin,

    das ist seltsam. Normalerweise bekommt man in wp-admin/network.php mitgeteilt, warum die eine oder andere Option nicht zur Verfügung steht. Im Fall der Subdirectories wird das über die Funktion allow_subdirectory_install() geprüft. Die antwortet mit FALSE wenn ein Post existiert, welches älter als ein Monat ist. Das kann man z.B. über die Konstante ALLOW_SUBDIRECTORY_INSTALL aber überschreiben. Wenn das nicht hilft, stell die Frage mal bei WordPress Stackexchange.

    Auf einem lokalen Entwicklungssystem braucht man kein Wildcard-DNS zu konfigurieren. In der Regel wird es reichen, wenn man die gewünschten (Sub-)Domains explizit in der Hosts-Datei einträgt. Nach dem Multisite-Setup ist es WordPress egal, ob die Domains existieren unter denen man neue Sites anlegt.

  3. 03) 30.07.2015
    Ria

    Hallo David,

    "Wenn du Sub-Domains lokal nutzen möchtest, richte dir localhost.localdomain ein. "

    Da dies nicht half habe ich in der network.php ***Deinen Rat befolgt*** und geändert:

    function allow_subdomain_install() {
    $domain = preg_replace( '|https?://([^/]+)|', '$1', get_option( 'home' ) );
    if( parse_url( get_option( 'home' ), PHP_URL_PATH ) || 'localhost' == $domain || preg_match( '|^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$|', $domain ) )
    return true;

    return true;
    }

    Beim ersten true stand false! Nun zeigt mir das richtige (ein anderes) Fenster die Auswahlknöpfe "Sub-Domains" oder Sub-Verzeichnisse.

    Lieben Dank! Du hast mich wirklich gerettet. Scheint wenig Leute zu geben, die sich mit den Multisite Sachen richtig auskennen.

    mfG. Ria

  4. 04) 30.07.2015
    David

    Lies bitte meine Texte deutlicher. Ich habe nicht empfohlen, die Core-Dateien zu editieren! Es hätte wohl genügt, wenn Du define( 'ALLOW_SUBDIRECTORY_INSTALL', TRUE); in die wp-config.php eingefügt hättest.

    Core-Files editiert man nie!

  5. 05) 31.07.2015
    Ria

    Hallo David,

    sorry, ist meine erste WP Webseite(die allerdings was größer werden wird), daher habe ich das Wort "Konstante" nicht richtig interpretiert.

    Mit wp-config.php, oben im Text, wäre ich sofort drauf gekommen. War kein schlampiges lesen von mir, sondern eher eine gewisse Unkenntnis in den Termini. Tut mir leid. "Core-Files editiert man nie!" Ja das wunderte mich schon etwas, nur bei anderen Systemen war sowas oft üblich.

    Also bitte nicht böse sein, hat mir ja geholfen und auf dem Home PC nicht tödlich :-)

    mfG Ria

Fragen, Ideen oder Kritik? – Hier ist Platz dafür!

Dein Kommentar

Um ein Kommentar abzugeben, reicht der Text im Kommentarfeld. Die Angabe eines Namens wäre nett, ist aber nicht erforderlich.

Du darfst folgenden HTML-Code verwenden, musst aber nicht:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>