.htaccessのmod_rewriteについて

.htaccessのmod_rewriteについて調べて見ました。

WordPressを使用していると.htaccessに次のように書かれているのを目にします。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

これは何をしているのだろうということで調べてみました。

IfModule mod_rewrite.c

<IfModule mod_rewrite.c>
 ・・・
</IfModule>

まずはこの部分。
mod_rewriteが使えるかを確認しています。
mod_rewriteが使えるならの間の処理をおこないます。

RewriteEngine

「RewriteEngine」と、mod_rewriteを使う際の宣言文です。
URLの書き換えをおこなう最初に一度だけ書いておけばOK(書き換えの都度書いてもOK)。

RewriteEngine On

と書いておきます。

RewriteEngine Off

で無効にできますが、使わないかな?

RewriteBase

URLを書き換えたの後のファイルがあるディレクトリのパスを示します。
例えば .htaccessをtestディレクトリに置いて、testディレクトリにあるindex.htmlにアクセスがあった場合、honyaディレクトリにあるhoge.htmlを表示してみます。
RewriteBase は「RewriteBase /honya」とします。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /honya
RewriteRule ^index\.html$ "hoge.html" [L]
</IfModule>

のように書きます。
http://linkgear.jp/test/index.htmlにアクセスしてみると

書き換え後もURLはhttp://linkgear.jp/test/index.htmlのままですが、http://linkgear.jp/honya/hoge.htmlの内容が表示されてます。

RewriteBase を「RewriteBase /」として見ると

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ "hoge.html" [L]
</IfModule>

「RewriteBase /」はルートディレクトリを示しているので、404エラーになります。

RewriteRule

書き換えのルールを書きます。

書式は
RewriteRule 書き換え元 書き換え先 [オプション]
で、書き換え元、書き換え先共に正規表現が使えます。

オプションは色々あるようですが、私が使いそうなのは[L]と[R=301]
[L]はRewriteでの書き換えを終了します。
[R=301]はリダイレクトします。

RewriteCond

URLの書き換えを行う条件を指定します。
RewriteCondは直後にあるRewriteRuleにしか適用されません。
また条件(RewriteCond)が複数ある場合は、最初の条件が次の条件を引き続き実行することになります。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

この場合では書き換え元のURL(REQUEST_FILENAME)がファイル(-f)でない(!)場合で、尚且つ書き換え元のURL(REQUEST_FILENAME)がディレクトリ(-d)でない(!)場合にRewriteRuleを実行します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です