レンタルサーバ

親ディレクトリのURL書き換え(mod_rewrite)を引き継ぐ

共用サーバでバーチャルホストを利用する(ディレクトリごとに複数のドメインを扱う)際に、親のディレクトリで設定したURL書き換え(mod_rewrite, RewriteEngine On)を各ディレクトリ(ドメイン)で継承する覚え書きです。下層ディレクトリでURL書き換えを引き継ぐにはRewriteOptions Inheritを設定します。

動作確認と例は、さくらインターネットの共用レンタルサーバ「ビジネス」でマルチドメインを使用したものです。その他の共用サーバでも似たようなものだと思いますので適当に読み替えて下さい。

さくらのレンタルサーバ ビジネス

各ドメインにまたがって管理できるCMSを使うとなると話は別だと思いますが、一つのサーバアカウントで複数のドメインを扱う場合は、例にあるような感じでドメインごとにディレクトリを割り振ると思います。

さくらインターネットの共用サーバでマルチドメインを使用した例
www/
  ├ example.jp/
  └ sample.net/

さくらインターネットの共用サーバでは、ウェブサイトのデータはwwwというフォルダ以下に設置します。

この場合、全部のドメインで共通するような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>