
1. mod_rewrite について
Apache というウェブサーバーソフトウェアには、mod_rewrite というモジュールが付いており、ウェブサーバーに送られたリクエストの宛先であるURLを書き換えることができます。リクエストは書き換え後のURLに対して送信されたものとして処理されます(ウェブブラウザにリダイレクトすることもできます)。
書き換えるためのルールは、「Apache の設定ファイル」もしくは「.htaccess
ファイル」に記述できるのですが、レンタルサーバーの場合は、Apache の設定ファイルに個別のサイトに関する設定を記述するのは難しいため、通常は .htaccess
ファイルに記述されます。
ここでは本サイトの .htaccess
ファイルに記述されているルール設定について解説します。
2. 本サイトでの書き換えルール
本サイトの.htaccess
ファイルに記述されている書き換えルールが以下です。
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPressp
これは WordPress が自動的に生成したのですが、WordPress の設定によっては異なる内容になることもあります。ソースコードでいうと、WordPress/class-wp-rewrite.php あたりが自動生成処理のようです。
では、この設定を 6つのパートに分けてそれぞれ説明していきます。
パート1
# BEGIN WordPress
{省略}
# END WordPress
先頭に #
がついている行はコメントです。
パート2
<IfModule mod_rewrite.c>
{ここに記述する}
</IfModule>
mod_rewrite モジュールに関する設定は、上の記述で囲みます。rewriteモジュールが存在していれば、囲んだ内容が読み込まれます。
パート3
RewriteEngine On
書き換えエンジンを有効 (On) にします。
パート4
RewriteBase /
URL のプレフィックス (prefix) を指定します。相対パスで置換ルールを書いた場合に、置換後のURLの先頭にここで指定した文字列が追加されます。
パート5
RewriteRule ^index\.php$ - [L]
RewriteRule
ディレクティブのフォーマットは以下です。
RewriteRule 正規表現パターン 置換文字列 [フラグ]
各引数について表で説明します。
正規表現パターン |
|
---|---|
置換文字列 |
|
フラグ |
|
今回の場合は第一引数が「^index\.php$
」となっており、これは index.php
というファイル名に直接アクセスされた場合にマッチします。第二引数が「-」となっているので置換は行われず、[L] フラグが指定されていることから、mod_rewrite の処理はここで終了します。つまり、URLパスは index.php
のままでリクエストが処理されます。
パート6
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
1行目と2行目では、RewriteCond ディレクティブによって条件を指定しています。「(1行目の条件が真)且つ(2行目の条件が真)」という関係になり、これが満たされた場合は、3行目の RewriteRule ディレクティブの処理が行われます。
1行目は「リクエストされたURLパスで指定されるファイルが存在しなかった場合」、2行目は「リクエストされたURLパスで指定されるディレクトリが存在しなかった場合」という意味になります。
3行目では、第一引数が「.」であるためにどんなURLでもマッチし、/index.php
というURLパスに置換されて処理されます。[L]フラグが指定されているので、rewrite の処理はここで終了です。
今回の場合、mod_rewrite の設定はここまでしか記述されていないため、1,2行目の条件が満たされない場合は、置換が起きず元のURLでアクセスされます。
まとめると、以下の動作になります。
- 指定されたURLパスに合致するファイルかディレクトリが存在すればそれにアクセスさせる。
- 存在しなければ
/index.php
にアクセスさせる。
詳しく知りたい方は、mod_rewrite – Apache HTTP Server Version 2.4 を参照してください。
3. まとめ
今回取り上げた設定内容がどういう動きになるのかについてまとめます。
index.php
にアクセスがあれば、そのままアクセスさせる。- 実在するファイルにアクセスがあれば、そのままアクセスさせる。
- 実在するディレクトリにアクセスがあれば、そのままアクセスさせる。
- それ以外の場合は、
index.php
にアクセスさせる。