無意義なつぶやき

渋谷ではたらくエンジニアブログ。

.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)に受け渡されていることがわかります。注意しないと無限ループが起こりエラーになる模様です。

 

まだ不明な部分も多いので逐一追加していきたいと思います。