.htaccessでmod_rewriteを使ったときのメモ
.htaccessでmod_rewriteを使ったときに、しばらくうまく動かなかった。
結局のところ幾点かの勘違いのせいだったのだけれど、これら分かりにくかった点をメモとして残しておく。
(触り始めたばかりなので、下記認識にも誤りがあるかもしれない…)
prefixの部分が取り除かれた状態でルールが適用される
ファイル構成
/somepath/ ┗ccc/index.html ┗eee/index.html .htaccess
RewriteEngine on RewriteBase /ccc RewriteRule ^/aaa$ index.html [L] RewriteRule ^/bbb$ /eee/index.html [L]
このとき、
- GET /aaa
- /somepath/aaa (物理パス)
- /aaa
- index.html (mod_rewriteによる書き換え)
- /ccc/index.html (RewriteBaseによる補完)
- /somepath/ccc/index.html
- GET /bbb
- /somepath/aaa (物理パス)
- /bbb
- /eee/index.html (mod_rewriteによる書き換え)
- (書き換えが"/"はじまりなので、RewriteBaseによる補完は走らない)
- /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も書き換え後のものとなる。