.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>
のように書きます。
書き換え後もURLはhttps://linkgear.jp/test/index.htmlのままですが、https://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を実行します。
コメント