共用サーバでバーチャルホストを利用する(ディレクトリごとに複数のドメインを扱う)際に、親のディレクトリで設定したURL書き換え(mod_rewrite
, RewriteEngine On
)を各ディレクトリ(ドメイン)で継承する覚え書きです。下層ディレクトリでURL書き換えを引き継ぐにはRewriteOptions Inherit
を設定します。
動作確認と例は、さくらインターネットの共用レンタルサーバ「ビジネス」でマルチドメインを使用したものです。その他の共用サーバでも似たようなものだと思いますので適当に読み替えて下さい。
各ドメインにまたがって管理できるCMSを使うとなると話は別だと思いますが、一つのサーバアカウントで複数のドメインを扱う場合は、例にあるような感じでドメインごとにディレクトリを割り振ると思います。
この場合、全部のドメインで共通するようなURLの書き換え(mod_rewrite
)は、www
直下に.htaccess
を置いて一つで済ませたいですが、下層ディレクトリに置いた.htaccess
でもう一度RewriteEngine on
してしまうと親ディレクトリで設定したリライトが効かなくなってしまいます。
/www/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine on
# ピリオドで始まるディレクトリへのアクセスをブロックする
RewriteRule "(^|/).(?!well-known)" - [F]
</IfModule>
/www/example.jp/.htaccess
<IfModule mod_rewrite.c>
# 親ディレクトリで設定したリライトが効かなくなる
RewriteEngine on
# このディレクトリでの設定
RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [L,R=301]
</IfModule>
親ディレクトリで設定したURL書き換えを下層でも引き継ぐにはRewriteOptions Inherit
を設定します。
<IfModule mod_rewrite.c>
RewriteEngine on
# 親ディレクトリのリライトを引き継ぐ
RewriteOptions Inherit
# このディレクトリでの設定
RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [L,R=301]
</IfModule>