Die WordPress-Multisite-Funktion bietet zwei verschiedene Installationsmodi: Subdomain und Unterverzeichnis install. Standardmäßig erlauben beide Modi die Verwaltung separater WordPress-Instanzen (Sites) innerhalb einer Installation und innerhalb einer Primärdomäne. Der offensichtliche Unterschied ist das URL-Schema für alle Sites (im Beispiel ist multisite.tld
der primäre Doman):
http://site1.multisite.tld
für Subdomain installieren undhttp://multisite.tld/site1
für die Installation im Unterverzeichnis.Da es möglich ist, beliebige Domains Sites zuzuordnen nachdem sie in beiden Modi erstellt wurden, frage ich mich, was die tatsächlichen Unterschiede zwischen beiden sind. Gibt es eine Möglichkeit, den Modus nach der Installation zu ändern?
Aus Benutzersicht gibt es zwei bemerkenswerte Unterschiede. Zuallererst die GUI zum Erstellen neuer Sites. Entweder wird ein Eingabefeld für das erstes Segment des URL-Pfads (Unterverzeichnis) oder ein Eingabefeld für die Unterdomäne angezeigt, die Sie für die neue Site verwenden möchten. (Das Setzen der URL auf einen völlig beliebigen Wert ist nur beim Bearbeiten einer bereits erstellten Site möglich. Dies ist jedoch in beiden Modi möglich.)
Der andere ist auf den ersten Blick nicht ersichtlich und betrifft nur den Unterverzeichnismodus: Die Permalink-Struktur der Hauptsites hat ein statisches Präfix blog/
, das nicht geändert werden soll. (Auch wenn es Lösungen geben könnte, die das Präfix ändern oder entfernen).
Aus technischer Sicht handelt es sich um eine andere Systemkonfiguration, die durch Konfigurationskonstanten, Konfigurationswerte in der Datenbank und auch die Konfiguration des Webservers definiert wird. Was den Modus an erster Stelle definiert, ist die Konstante IS_SUBDOMAIN_INSTALL
, die auf true
(Unterdomänenmodus) oder false
(Unterverzeichnismodus) eingestellt werden kann. Dies ist jedoch nicht der einzige Ort, an dem diese Informationen gespeichert werden. Während des Installationsvorgangs speichert WordPress einen ganzzahligen Wert als Site-Meta mit der Taste subdomain_install
. Es kann über WP-CLI gelesen (oder aktualisiert) werden:
$ wp site option get subdomain_install
1
Der Unterverzeichnismodus führt ferner zu einem zusätzlichen Element in der Liste der verbotenen Site-Slugs: blog
. Diese Liste ist im Site-Meta illegal_names
gespeichert. Daher sieht es im Unterverzeichnismodus standardmäßig so aus:
$ wp site option get illegal_names
array (
0 => 'www',
1 => 'web',
2 => 'root',
3 => 'admin',
4 => 'main',
5 => 'invite',
6 => 'administrator',
7 => 'files',
8 => 'blog',
)
Da der Webserver nicht für WordPress-Interna verantwortlich ist, geht es bei seiner Konfiguration darum, die angeforderte URL an das richtige Skript oder die richtige Asset-Datei weiterzuleiten. In erster Linie geht es um die Frage, ob Anforderungs-URLs wie /site-slug/wp-[admin|content|includes]
und /site-slug/wp-*.php
an die entsprechenden Verzeichnisse (/wp-*/
) oder Skripte weitergeleitet werden sollen.
Der vorgeschlagene Standardsatz von Umschreiberegeln für Unterverzeichnismodus lautet also:
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]
Während die Einstellung für Subdomain-Modus wie folgt vorgeschlagen wird:
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]
Welche Art von Regelsatz verwendet wird, hängt stark vom gewünschten Domain-Schema ab, das Sie für Ihre Multisite-Site planen. Das flexiblere ist natürlich das erste (Unterverzeichnis) da das URL-Pfadsegment ("Unterverzeichnis") völlig optional ist.
is_subdomain_install()
API-FunktionUm zu wissen, welcher Modus konfiguriert ist, bietet WordPress die Funktion is_subdomain_install()
, die true
zurückgibt, wenn:
SUBDOMAIN_INSTALL
wird definiert und auf true
gesetzt oder SUBDOMAIN_INSTALL
ist nicht definiert, aber VHOST
ist definiert und auf 'yes'
gesetztEs gibt false
zurück, wenn SUBDOMAIN_INSTALL
definiert und auf false
gesetzt ist. Und es gibt alles andere zurück, wenn SUBDOMAIN_INSTALL
definiert ist, aber nicht vom Typ boolean. Der oben genannte Site-Meta-Wert wird nur während des Setup-Vorgangs der Mutliste verwendet. Der WordPress-Kern verlässt sich nur auf den Wert dieser Konstanten, die sonst überall zu finden sind.
Der Wert von is_subdomain_install()
wirkt sich jedoch nur dann auf das Routing der angeforderten URL zu einer bestimmten Site im Netzwerk aus, wenn die Konstanten DOMAIN_CURRENT_SITE
und PATH_CURRENT_SITE
nicht definiert sind. (Siehe ms_load_current_site_and_network()
). Das bedeutet, dass in beiden Modi jede Domain als Site-URL verwendet werden kann (Domain-Mapping).
IS_SUBDOMAIN_INSTALL
von true
in false
Setzen Sie den Wert von Site-Meta subdomain_install
auf 0
:
$wp site option set subdomain_install 0
/blog/
hinzu. Es wird behoben, nachdem die Einstellung aktualisiert wurde.blog
zur Liste der verbotenen Site-Slugs hinzu. Da es sich bei dieser Liste um einen serialisierten Wert handelt, sollte dies über ein kleines Skript PHP erfolgen, das über WP-CLI ausgeführt werden kann:$ wp eval-file patch-forbidden-slugs.php
// patch-forbidden-slugs.php
<?php
$illegalNames = get_metadata( 'site', SITE_ID_CURRENT_SITE, 'illegal_names', true );
$blogSlug = 'blog';
if ( in_array( $blogSlug, $illegalNames ) ) {
exit( 'Noting to do' . PHP_EOL );
}
$illegalNames[] = $blogSlug;
update_metadata( 'site', SITE_ID_CURRENT_SITE, 'illegal_names', $illegalNames );
exit( 'Done' . PHP_EOL );
IS_SUBDOMAIN_INSTALL
von false
in true
Setzen Sie den Wert von Site-Meta subdomain_install
auf 1
:
$ wp site option set subdomain_install 1
Entfernen Sie das Präfix /blog/
aus der Permalink-Struktur der Hauptwebsite
blog
aus der Liste der verbotenen Namen (passen Sie das Skript von oben entsprechend an).Meine Ausführungen beziehen sich nur auf eine saubere WordPress-Installation und eine unmittelbar darauf folgende Netzwerkinstallation. Auch die neueste WordPress-Version 4.8 wird berücksichtigt. Es ist möglich, dass es Auswirkungen auf eine Installation mit mehreren Standorten auf einem vorhandenen System gibt, auf dem Plugins oder eine ältere WordPress-Version verwendet werden.
Mein bevorzugtes Setup ist jedoch der Unterdomänenmodus mit dem Regelsatz .htaccess für Unterverzeichnisse, da er die größte Flexibilität bietet. Es funktioniert sogar mit modernen komponistengesteuerten Setups wie WPStarter (mit geringfügiger Anpassung der .htaccess-Regeln).