サブディレクトリに設置した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 . |