.htaccessでmod_rewriteを使ったときのメモ

.htaccessmod_rewriteを使ったときに、しばらくうまく動かなかった。
結局のところ幾点かの勘違いのせいだったのだけれど、これら分かりにくかった点をメモとして残しておく。
(触り始めたばかりなので、下記認識にも誤りがあるかもしれない…)

prefixの部分が取り除かれた状態でルールが適用される

ファイル構成

/somepath/
┗ccc/index.html
┗eee/index.html
.htaccess

.htaccess

RewriteEngine on
RewriteBase /ccc

RewriteRule ^/aaa$ index.html [L]
RewriteRule ^/bbb$ /eee/index.html [L]

このとき、

  • GET /aaa
    1. /somepath/aaa (物理パス)
    2. /aaa
    3. index.html (mod_rewriteによる書き換え)
    4. /ccc/index.html (RewriteBaseによる補完)
    5. /somepath/ccc/index.html
  • GET /bbb
    1. /somepath/aaa (物理パス)
    2. /bbb
    3. /eee/index.html (mod_rewriteによる書き換え)
    4. (書き換えが"/"はじまりなので、RewriteBaseによる補完は走らない)
    5. /somepath/eee/index.html

RewriteCondは直後のRewriteRule一つに作用する

RewriteEngine on
RewriteBase /ccc
RewriteCond %{HTTP_USER_AGENT} iPhone [NC]
RewriteRule ^/hhh$                                                       index.html                    [R]
RewriteRule ^/iii?$                                                      /eee/index.html                 [R]

UserAgentでiPhoneからのアクセスかどうかを見分けるRewriteCondだが、これが作用するのは"^/hhh$→/ccc/index.html"のルールのみ。

オプション[R]と[L]

  • [L]
    • 最後の書き換えとなり、以降のルールは無視される。
    • この書き換え後も、ブラウザ上のURLはそのまま。
  • [R]
    • リダイレクト。
    • この書き換え後は、ブラウザ上のURLも書き換え後のものとなる。

.htaccessでのmod_rewriteは使わないほうがいい

httpd.confに書くのと違い、リクエスト毎に処理が走るためパフォーマンスに影響がでる。