URL designing with mod_rewrite
- Date
- 2006-08-09 (Wed)
- Category
- Web
前のエントリの続きを書きたいのだけれど、ちょいと忙しいので…この project が終わったらえいやと片付けます。
SEO とか、お題目のように唱えてる人たちには興味ないけど、例えば Flickr の URL designing はクールだよね、と思います。どの web 系 MVC framework にもたいてい mod_rewrite を使って、V(View) への redirector とか入れてあるし。でもな〜、mod_rewrite 難しそうだし。だいたい introduction の文章の始まりが悪いよね。。
”膨大な設定例やドキュメントがあるにもかかわらず、 mod_rewrite は黒魔術である。かなりイケてるっぽい黒魔術だが、 やっぱり黒魔術である。“ -- Brian Moore Apache 1.3 mod_rewrite モジュール より
黒魔術だもん。しかも文の締めもスゴい否定的だし。っていうかこの文章は、5年くらい前、僕に RegEx は難しいっていうトラウマを産みつけたよね… それに比べて 2.2 のApache Module mod_rewrite はこざっぱりしている。こっちを先に読みたかった。。
解説なんかは、ググればいくらでもでてくるので、バックグラウンドでどういう風に処理してるかを、 Wordpress を例に手短に説明してみたいと思う。。
Worepress を例にとって
Worepress では管理画面 Options -> Permalinks で、permalink の構造を変えることができる。default だと、index.php をただ省略しただけで、query 文字列が丸見え ?=123 みたいに。それだとまず Ugly だし、Search Engine 的にも良くないので、static なページ風に見せましょう、ってデフォルトで二つ選択肢があります。まとめるとこんな感じ(Wordpress まま)。
- Default
- http://example.local/?p=123
- Date and name based
- http://example.local/2006/08/09/sample-post/
- Numeric
- http://example.local/archives/123
ようやく閑話休題。下のふたつは .htaccess ファイルを Wordpress 側で生成して、その中で mod_rewrite を使っているんだ。ははぁ、けっこう構造違うし、2種類の htaccess があって、見比べれば勉強になるかもと思った。甘かった。どちらを使っても生成される htaccess は一緒。以下転載。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
ググると URL の一部を切り取って、それを query に再構築みたいな例はいくらでも見つかるけど、それって、query を変えるたびに htaccess を書かなきゃ行けないってことでしょ!?それはちょっと…と思っていたので、Wordpress のこの方法はぜひとも理解したい。結果、黒魔法でもありませんでした。
1行目: RewriteEngine ディレクティヴ
ノーコメントで。スイッチオン。
2行目: RewriteBase ディレクティヴ
これだけはググって意味が分かった。Apache のアクセス制限: /~dareka での設定 の前後を読むといい。要するに、最終出力の URL のベースを指定する。
3〜4行目: RewriteCond ディレクティヴ
どういう条件で、URL を変更するのか、という条件を記述する。引数( %{SOME_VAR} ) はサーバ変数や、正規表現のバックリファレンス(正規表現でマッチした部分の文字列)なんかを入れられる。上記の Wordpress の例ではサーバ変数を使っていて、お尻に付いてる !-f と !-d はオプションでそれぞれ、ファイルではない、とディレクトリではない、という意味。というわけで全体では、
『リクエストされた URI がファイルあるいはディレクトリを指し示さないとき、以下のルールで URL を書き換える』
という意味でした。
5行目: RewriteRule ディレクティヴ
これが本命。実際の URL 変換ルールはここに書く。これを間違えると死ねるらしいし、ここでは一行しかないけれど何行も書いて、複雑な処理をすることもできるらしい。これに関してもググればいくらでも例があるのでそちらを参照。この文章の意味は
『一文字 (.) 以上の入力があると、それはすべて index.php にリダイレクトしてください。[L] があるので、mod_rewrite 用の処理はこれでおしまいです。』
という意味。
まとめ
え?じゃぁ URI は mod_rewrite で組み直したりしてないの?と思った人、その通り。ではどうしてるかというと、HTTP リクエスト自体をもう一度見直してそれを処理側で組み直しているのです。例えば PHP だと $_SERVER['REQUEST_URI']; とすると、HTTP リクエスト自体を取得できます。それを PHP で処理して、必要な Controller なり Model なりを適用する、と。
正直ちょっとすっきりしない。だって URI の組み直しを2箇所で別々にやってるってことでしょ?パフォーマンス悪そう。でもそのかわり柔軟性は高いねぇ。どっちがいいのかな??
Comment:0
Trackback:0
- TrackBack URL for this entry
- http://blogs.grf-design.com/mt/mt-tb.cgi/182
- Listed below are links to weblogs that reference
- URL designing with mod_rewrite from The Croton