web-dev-qa-db-de.com

Multisite: Unterschiede zwischen Subdomain- und Unterverzeichnismodus? Kann es nach der Installation umgestellt werden?

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 und
  • http://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?

4
David

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',
)

Apache-Umschreibkonfiguration

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.

Sunrising (WordPress-Routing) und is_subdomain_install() API-Funktion

Um zu wissen, welcher Modus konfiguriert ist, bietet WordPress die Funktion is_subdomain_install(), die true zurückgibt, wenn:

  • die Konstante SUBDOMAIN_INSTALL wird definiert und auf true gesetzt oder
  • die Konstante SUBDOMAIN_INSTALL ist nicht definiert, aber VHOST ist definiert und auf 'yes' gesetzt

Es 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).

Umschalten der Modi nach dem Setup

Wechsel der Formular-Subdomain in den Unterverzeichnismodus

  • Ändern Sie den Wert der Konstante 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

  • Fügen Sie der Permalink-Struktur der Hauptseite das Präfix /blog/ hinzu. Es wird behoben, nachdem die Einstellung aktualisiert wurde.
  • Fügen Sie 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 );

Formular-Unterverzeichnis in den Subdomain-Modus wechseln

  • Ändern Sie den Wert der Konstante 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

  • Entfernen Sie den Slug blog aus der Liste der verbotenen Namen (passen Sie das Skript von oben entsprechend an).

Fazit

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).

4
David