サブディレクトリに設置したWordPressがサイトネットワーク管理のURLを正常に認識できない問題の解決方法(nginx、Apache)

この情報は非常に限定的で、万人が必要とする情報ではないが、ハマるととことんハマってしまう問題だと思われる。一般にWordPressのマルチサイト機能は、使う人があまり多くないため情報が少なく、この問題で検索しても、「マルチサイトでサブディレクトリ形式のサイトを作る方法」という初心者向けの当たり前の方法しか出てこなかった。しかもnginxとなると、情報は限りなく少なくなり、検索による解決は絶望的である。このページが、そんな迷える子羊たちの助けとなれば幸いである。

「WordPressをマルチサイトで運用する際に、WordPressをサブディレクトリに設置(インストール)すると不整合が起きる」

という問題について。
WordPressは、サブディレクトリにインストールするが、サイトURLはルートディレクトリにする、という設置の仕方が可能だ。これは公式ドキュメントにもやり方が乗っている。
WordPressURL : https://example.com/wordpress/
サイトURL : https//example.com/
やり方は簡単、/wordpress/の中にあるindex.phpをひとつ上のルート位置に移動させ、インクルードパスを書き換えるだけだ。

#require __DIR__ . '/wp-blog-header.php';
require __DIR__ . '/wordpress/wp-blog-header.php';

しかし、この設置の方法でマルチサイトを作ろうとすると、途端に困ったことになる。
サイトネットワークのURLが、サイトURLベースになってしまうのだ。サイト設定を変更しようとしたり、プラグインを変更しようとしたりすると、「https://example.com/wordpress/wp-admin/network/」ではなく、WordPress上では「https://example.com/wp-admin/network/」へのリンクとして扱われてしまうのだ。
表示だけなら、URLを手動で修正してアクセスすれば見えるが、その後の設定変更などのPOST先も「/wp-admin/network/」になってしまうため、変更を保存することが出来ない!

Apacheの場合の解決法

.htaccessを

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L]

以下のように編集すると良い。

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

これで、/wp-admin/にアクセスされた場合にも、/wordpress/wp-admin にリライトされる。

広告

nginxの場合

location ^~ /wp-admin/network/
でなんとか出来ないか、色々と試行錯誤、四苦八苦したけどどうにもならなかった。
結果、サイトルートに /wordpress/wp-admin へのシンボリックリンクを設置する、という方法でひとまず問題が解消されることは確認できた。

$ ln -s /wordpress/wp-admin .

About: dacelo


Leave a Reply

Your email address will not be published. Required fields are marked *