

[このエントリーに書いた方法よりいい方法があったのでコチラの方法をお試しください](https://www.chaordic.co.jp/memorandum/chaordicdesign/49/)
すでにWordPress(以下WP)がルートで運用されているレンタルサーバーに、マルチ・ドメインを追加して別サイトを運営しようとした時、ちょっとしたトラブルに見舞われました。これはその時のメモと、暫定的な解決方法です。
このサーバーでは、マルチ・ドメインのルートを親ドメインの下につくらなければなりませんでした。つまり、親ドメインのWP用 **.htaccess設定** がマルチ・ドメインにも影響を及ぼしていたのです。
仮に **domain.com** を親ドメイン、 **sub.domain.com** をマルチ・ドメインとすると、ディレクトリの構成はこうなります。
home/ (domain.com)
.htaccess (WPの.htaccess )
index.php
wp/ (WPのディレクトリ)
sub.domain.com/
.htaccess (マルチ・ドメインの.htaccess )
index.html
##### WordPress用の.htaccess
まず、WPの.htaccessを見ていきます。
# BEGIN WordPress
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
<IfModule mod_rewrite.c>はmod_rewriteが使用できる環境を分岐させるもので、その下3行は基本的な設定となりますので、**WPのリライト設定** を抜き出すと以下になります。
# -- WPのリライト設定
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
##### マルチ・ドメイン用の.htaccess
次にマルチ・ドメイン用の.htaccessを見ていきます。
これは、今回使用したレンタル・サーバーで、マルチ・ドメインを設定した際に設置するものとして提示されたものです。
# Enable RewriteEngine.
RewriteEngine On
# -- マルチ・ドメインのリライト設定
RewriteCond %{HTTP_HOST} ^(sub.domain.com)
RewriteCond %{REQUEST_URI} !^/(sub.domain.com)/
RewriteRule ^(.*)$ /%{HTTP_HOST}/$1/ [L]
##### 動いた.htaccess
結果、それなりに動いたのは下記の設定となりました。
マルチ・ドメインの.htaccessは削除して、ルートの.htaccessひとつにまとめてあります。
もともとあった **WPの.htaccess** に **マルチ・ドメイン用の.htaccess** を追加して一つにまとめました。肝心なのは、**マルチ・ドメインのリライト設定** を **WPのリライト設定** より先に置くこと。
RewriteRule ~[L]の **[L]** は、その **RewriteRule** が実行されたらそこで終了を意味します。その後の設定はすべてキャンセルされますので、順番が逆だと、より広範囲なWPのリライト設定が先に実行され、サブドメインのリライト設定に届かないことがでてきてしまうわけです。
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
# -- マルチ・ドメインのリライト設定
RewriteCond %{HTTP_HOST} ^(sub.domain.com)
RewriteCond %{REQUEST_URI} !^/(sub.domain.com)/
RewriteRule ^(.*)$ /%{HTTP_HOST}/$1/ [L]
# -- WPのリライト設定
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
##### (追記)404エラーの処理
ただし、このままだとマルチ・ドメイン配下において404エラーが発生した場合、WPの404ページにリダイレクトしてしまうことがわかりました。その対処は以下のようにしました。
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
# -- マルチ・ドメインのリライト設定
RewriteCond %{HTTP_HOST} ^(sub.domain.com)
RewriteCond %{REQUEST_URI} !^/(sub.domain.com)/
RewriteRule ^(.*)$ /%{HTTP_HOST}/$1/ [L]
# -- WPのリライト設定
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(^/sub.domain.com/) #←除外
RewriteRule . /index.php [L]
ErrorDocument 404 /sub.domain.com/404.html #←404リダイレクト
追加したのは「#←除外」と「#←404リダイレクト」の箇所です。
WPのリダイレクトがなされる直前に、その処理から指定のディレクトリを除外する命令を付け足しています。
そして最後に、これまでの命令から漏れたリクエストが404エラーとして指定ページ(/sub.domain.com/404.html)にリダイレクトされるようになっています。
2022-06-15 18:58:45
ソースコードは自由にお使いください。また、何らかの不利益が生じたとしても一切責任を負いません。