.htaccessからRewriteを学ぶ
引き続きmod_rewriteについてです。
前回記事→CakePHPのインストールとRewriteエラー
前回までにmod_rewriteを利用するにはhttpd.confへの記述が必要だと学びました。
では実際にどのようにURLのリライトを行うか、考えていきたいと思います。
cake/app/webroot/index.phpとディレクトリが存在するものとして考えます。
cake,app,webrootディレクトリにそれぞれ.htaccessでの記述が必要です。
cake/
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>
cake/app
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]
</IfModule>
cake/app/webroot
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
色々書いてありますが最終的にはcake/app/webroot/index.phpを表示させるようになってます。
.htaccess(cake/)
RewriteRuleが実際にどう書き換えるかを記述してる部分です。
^$とか^(.*)$とかありますが正規表現と言われるものです、またどこかで詳しく書きたいと思います。
^は最初の文字、$が最後の文字を検索します。また(.*)はですが、.は任意の1文字*は.の0回以上の繰り返しを意味します。そして[L]はRewriteRuleが適用されればそこで処理が終わることを意味します。
例えば
cake/testにアクセスしたとすると
RewriteRule (.*) app/webroot/$1が適用され、cake/app/webroot/testにリライトされることになります。ちなみに( )で囲んであるものが$1に置き換わります。
.htaccess(cake/app)
同様にcake/app/testならばcake/app/webroot/testにリライトされます。
.htaccess(cake/app/webroot)
RewriteCondはRewriteRuleを適用するための条件を書きます。
%{REQUEST_FILENAME} は指定する名前のファイルがあればという意味、!-d,!-fは否定を表すので指定したファイル・ディレクトリが無ければという意味です。
つまりcake/app/webroot/testと指定した場合webrootディレクトリ直下にtestというファイル・ディレクトリが無ければcake/app/webroot/index.phpに書き換えるという意味になります。
一連の流れを見てきました。
もう一度おさらいすると
cake/test→cake/app/webroot→cake/app/webroot/index.phpという流れです。
上位ディレクトリに存在する.htaccess(cake)の設定で下位にある.htaccess(webroot)に受け渡されていることがわかります。注意しないと無限ループが起こりエラーになる模様です。
まだ不明な部分も多いので逐一追加していきたいと思います。