[.htaccess] 条件に該当するURLを書き換える [mod_rewrite]

“http://hostname/demo/~” というURLリクエストは全て “demo/index.php” に処理させたい…
“http://hostname/index.php?a=b” や “http://hostname/search.php?kwd=hoge” って感じのURLはいやだから “http://hostname/index?a=b” や “http://hostname/search/hoge” って感じのURLにしたい…

という時の対処法をご紹介します。

今回は .htaccess で mod_rewrite を使います。
(.htaccessが利用可能かどうかは、設置環境によって違うので各々ご確認を。)

ご紹介するのは「アクセスされたURLが http://hostname/demo/hoge/fuga でも http://hostname/demo/foo/bar/123 でも hoge/index.php に処理させる」という時の .htaccess 書き方の例です。
例では画像などへのリクエストは対象外になるうよう書いて言います。
[crayon]
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule \.(png|jpg|jpeg|gif|bmp|ico|css|js)$ – [L]
RewriteRule ^(.*)$ index.php?/$1 [QSA,L]
[/crayon]

<解説>

[crayon start-line=”1″]RewriteEngine On[/crayon]
URL書き換えエンジンON!という意味です。これがなくては始まりません。

[crayon start-line=”2″]RewriteCond %{REQUEST_FILENAME} -f[/crayon]
RewriteCond は直後の RewriteRule の 適用条件 となります。
%{REQUEST_FILENAME} はリクエストを受けたファイル名で -f は「ファイルが存在する場合」という意味です。

[crayon start-line=”3″]RewriteRule \.(png|jpg|jpeg|gif|bmp|ico|css|js)$ – [L][/crayon]
RewriteRule はURL書き換えルールですが、書き換え後のURLが「」となっているので、URLの書き換えは行われません。
また、[L] がついているので、この条件に該当したURLは、以後の RewriteRule に該当してもURLの書き換えが行われません。
「\.(png|jpg|jpeg|gif|bmp|ico|css|js)$」は「ファイル名の末尾が”.png”, “.jpg”, “.jpeg”, “.gif”, “*.bmp”, “*.ico”, “*.css”, “*.js” のどれか」ということを正規表現を使って表しています。
そして直前の RewriteCond が効いているので、存在する画像やスタイルシートやJavaScriptのファイルに対してはURLの書き換えは行わない!という条件が完成します。

ここまでで該当しなかったURLについては次の1行で index.php へのリクエストとして書き換えられます。
[crayon start-line=”4″]RewriteRule ^(.*)$ index.php?/$1 [QSA,L][/crayon]
「QSA」は必須です。付けないとパラメータ付きURLのパラメータ部分( http://hostname/demo?kwd=hoge なら “?kwd=hoge” )が無視されてしまいます。
「index.php?/$1」は書き換え後のURLです。
「$1」は正規表現「^(.*)$」にマッチした文字のうち、括弧内の条件にマッチした文字を表しています。
「^(.*)$」は、文字列の最初から最後までにマッチさせる正規表現です。(^ は先頭を表し $ は末尾を表します。)

この .htaccess を http://hostname/demo/ の下に置いた時は、アクセスされたURLが「http://hostname/demo/test/hoge」ならば「http://hostname/demo/index.php?/test/hoge」へのアクセスであると内部で解釈されます。

なお、 index.php では受け取ったURLから要望を理解して処理を行う必要があります。
index.php の処理については、CakePHP などのソースが(多少難しいですが)参考になるかと思います。

スポンサーリンク