Veröffentlicht am Schreib einen Kommentar

nginx: WordPress-Multisites in Unterverzeichnissen

Beim Umstellen meiner lokalen Entwicklungsumgebung auf ein von mir selbst verwalteten nginx hat sich mir die Frage gestellt, wie ich Multisites in Unterverzeichnissen funktional bekomme. Dabei rede ich nicht davon, dass eine Multisite mit Unterverzeichnissen in nginx verwendet werden kann. Das war zum einen kein Problem, zum anderen gibt es dafür viele Anleitungen im Internet.

Konkret ging es darum, mehrere Unterverzeichnisse unter localhost zu haben, die wiederum selbst eine WordPress-Instanz mit aktiver Multisite besitzen.

Beispiel:

localhost/wp1/
localhost/wp2/
localhost/wp3/

Diese sollten wiederum alle Unterseiten sauber aufrufen können. Beispiel:

localhost/wp1/site1/
localhost/wp1/site2/
localhost/wp1/site2/subsite/

Dabei muss nginx wissen, wie er grundsätzlich Anfragen innerhalb der einzelnen WordPress-Instanzen handhaben soll. Daher muss innerhalb der Server-Direktive zuerst das entsprechende try_files angegeben werden, damit sämtliche Aufrufe innerhalb dieser Verzeichnisse über die dort liegende index.php laufen:

location /wp1/ {
	try_files $uri $uri/ /wp1/index.php?$args;
}

location /wp2/ {
	try_files $uri $uri/ /wp2/index.php?$args;
}

location /wp2/ {
	try_files $uri $uri/ /wp2/index.php?$args;
}

Nun verhält es sich allerdings so, dass Aufrufe von localhost/wp1/site1/ nicht als Aufruf des Verzeichnisses /wp1/ gelten und daher nicht sauber verarbeitet werden. Hier muss demnach geprüft werden, ob die dort liegende Datei existiert. Falls nicht, wird die Anfrage an das jeweilige WordPress geschickt:

if (!-e $request_filename) {
	rewrite ^/wp1(/[^/]+)?(/wp-.*) /wp1$2 last;
	rewrite ^/wp1(/[^/]+)?(/.*\.php)$ /wp1$2 last;
	rewrite ^/wp2(/[^/]+)?(/wp-.*) /wp2$2 last;
	rewrite ^/wp2(/[^/]+)?(/.*\.php)$ /wp2$2 last;
	rewrite ^/wp3(/[^/]+)?(/wp-.*) /wp3$2 last;
	rewrite ^/wp3(/[^/]+)?(/.*\.php)$ /wp3$2 last;
}

Das betrifft alle Anfragen, die entweder in einem Unterverzeichnis ausgeführt werden, das unter /wpX/siteX/wp- liegt, also beispielsweise /wp1/site2/wp-admin/, oder dort direkt eine PHP-Datei aufruft, beispielsweise über /wp2/site3/index.php. Diese Aufrufe werden dann jeweils zu dem WordPress umgeleitet, aus der Anfrage von /wp3/site3/wp-admin/plugins.php wird demnach /wp3/wp-admin/plugins.php. Über die URL weiß das WordPress allerdings dennoch, dass es die Plugin-Informationen aus site3 anzeigen muss.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.