.htaccessの適応範囲と優先順位

アクセス制御などで活用する.htaccessファイルですが、

  • サブディレクトリにワードプレスをインストールしたら.htaccessはどうなるの?
  • サブドメインの場合の.htaccessはどうなるの?
  • 適応範囲や優先順位は?

などの疑問にお答えします。

基本的には、サイトごとにそれぞれの.htaccessで管理するのがおすすめです。
スポンサーリンク

ワードプレス1つで1つの.htaccessが生成される

ワードプレスでサイトを立ち上げる際、Topだけでなくサブディレクトリにもワードプレスをインストールすることができます。

htaccessの優先順位

例えば、サブディレクトリ

  • example.com/siteA/
  • example.com/siteB/
  • example.com/siteC/

のそれぞれにワードプレスをインストールすると、サブディレクトリにインストールしたワードプレスにも.htaccessファイルが生成されます。
(サブドメインの場合も同様です。)

htaccessの優先順位

.htaccessの適応範囲は下位ディレクトリすべて

.htaccessに記述した設定は、設置したディレクトリおよび下位のディレクトリに対して適用されます。

htaccessの優先順位
例えば、サブディレクトリに作成したサイト

  • example.com/siteA/
  • example.com/siteB/
  • example.com/siteC/

の3サイトはそれぞれ独自の.htaccessファイルを持ちますが、Topドメイン(example.com)の.htaccessの内容も同時に適用されます。

設定が競合する場合は、下位ディレクトリの内容が優先される

それぞれの.htaccessに競合する設定が記述されていた場合は、下位ディレクトリの.htaccessの設定が優先されます。

たとえば、サイトCとTopドメインの.htaccess設定が競合した場合を想定します。

htaccessの優先順位

Topドメインには、ファイル一覧表示を許可する設定である

# Directory List
Options Indexes

が設定されており、

サイトCではファイル一覧表示を許可しない設定である

# Directory List
Options -Indexes

が設定されていたとします。

この二つの設定は完全に競合する設定になってしまっています。

設定が競合する場合は、下位ディレクトリのサイトでは自分の.htaccessの設定を優先します。

つまりサイトCでは、サイトC自身の.htaccessを採用するため

# Directory List
Options -Indexes

のみが適応されます。

設定が競合しない場合は、両方の内容が設定される

Topドメインの.htaccess設定と下位ディレクトリの.htaccess設定が競合していない場合は、両方の設定が適応されます。

htaccessの優先順位例えば、Topドメインで

# Directory List
Options Indexes

が設定されており、

siteCでは

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.bluegoat\.jp
RewriteRule ^(.*)$ http://bluegoat.jp/$1 [R=301,L]

が設定されていたとします。(www.あり→なしへのリダイレクト)

この場合、サイトCでは両方の設定が適応されます。

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.bluegoat\.jp
RewriteRule ^(.*)$ http://bluegoat.jp/$1 [R=301,L]
# Directory List
Options Indexes

1ファイルの中では上から順番に適用される

.htaccessの内容は、上から順番に判定→実施されていきます。
そのため、全体設定よりも、個別設定から先に記載する必要があります。

たとえば、旧ドメインから新ドメインにリダイレクトする際に、特定のページだけパスが変わるケースを想定します。

ドメイン変更
旧ドメイン.com → 新ドメイン.com

一部のページのパスが変更
旧ドメイン.com/aaa → 新ドメイン.com/xxx
旧ドメイン.com/bbb → 新ドメイン.com/yyy
旧ドメイン.com/ccc → 新ドメイン.com/zzz

このようなケースでは、以下のように全体設定を先に記載してしまうと

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(旧ドメイン.com)(:80)? [NC]
RewriteRule ^(.*) http://新ドメイン.com/$1 [R=301,L]
RewriteRule ^folder/aaa$ http://新ドメイン.com/folder/xxxxx [R=301,L]
RewriteRule ^folder/bbb$ http://新ドメイン.com/folder/yyyyy [R=301,L]
RewriteRule ^folder/ccc$ http://新ドメイン.com/folder/zzzzz [R=301,L]
</IfModule>

先に旧ドメイン.com → 新ドメイン.comの判定が行われてリダイレクトが実施されてしまうので、個別の設定まで判定処理が実施されません。

ページ単位、ディレクトリ単位でのリダイレクトを行いたい場合は、ドメイン単位の設定よりも上に記載してください。

おすすめの記事