対象
環境: Apache HTTP Server 2.2
※ おそらく2.4も同じでは….?
コンテキスト
2種類ある
per-server configuration
:httpd.conf
等のconfファイルや<Virtualhost>
ディレクティブ内に直書きのルールper-directory configuration
:<Directory>
ディレクティブ内や.htaccess
に書かれたルール
contextによって、RewriteRule のパターンマッチングの挙動等に細かい違いがある。
例: パターンマッチングの挙動
per-server configuration
=> matched against the part of the URL after the hostname and port, and before the query string (e.g. “/app1/index.html”).per-directory configuration
=> matched against the filesystem path, after removing the prefix that led the server to the current RewriteRule (e.g. “app1/index.html” or “index.html” depending on where the directives are defined).
処理順序
冷静に考えると当然だが、per-server configuration
のほうが先に処理される。
So, after a request comes in and Apache has determined the corresponding server (or virtual server) the rewriting engine starts processing of all mod_rewrite directives from the per-server configuration in the URL-to-filename phase. A few steps later when the final data directories are found, the per-directory configuration directives of mod_rewrite are triggered in the Fixup phase.
Apache mod_rewrite Technical Details
RewriteRule の継承
サブディレクトリの .htaccess
に RewriteRule
を書くと、親ディレクトリの .htaccess
に書かれた RewriteRule
は効かなくなる。
親ディレクトリのリライトルールを継承させるには、RewriteOptions inherit の設定が必要。
参考:
その他
.htaccess
については、対象パスの .htaccess
をリクエスト毎に動的に探索するため、原理的に若干遅くなる (21世紀の今日に心配するレベルかは….)。