menu
書いてる野郎
orebike@gmail.com
RewriteEngine On
RewriteCondは条件の番兵のように働く。ズラズラ単に並べて書いていくとRuleに対するAnd条件で結合されていく
URLは外部的なアクセスされたそのものと、内部で使っているものがある。 RewriteRuleはそこの間に挟まって操作する。
この設定を記述する .htaccess
が http://example.com/hogehoge
階層に設置されていた場合
RewriteBase /hogehoge
とすることで、この階層を起点に後のルールを記述できる
aaa.html というファイル名が含まれている URL が来たら bbb.html へリダイレクトさせる
RewriteRule aaa.html bbb.html [R,L]
このコードは RewriteRule の挙動を説明する例で実用上特に意味は無い。
これは階層関係なく aaa.html という名前であればなんでも bbb.html に移動してしまい、 この bbb.html も階層考慮無く RewriteBase を起点にしたものに書き換えるからだ。
ケツの R
はリダイレクト L
は処理終了を意味している
つまり↑の厳密バージョン
RewriteRule ^hoge/aaa\.html piyo/bbb.html [R,L]
正規表現で先頭指定することで階層を厳密に判定するようにした
先頭にスラッシュをつけると、RewriteBase を無視してドメインのルートからと判定される。
RewriteRule ^/hoge/(.*) /$1 [L]
この場合だと不要なhogeというURLを切り詰める
後ろの[L]
の表記はマッチしたらここでおしまいということだ
任意のURLを1階層切り詰めるには
RewriteRule ^/[^/]*/(.*) /$1 [L]
のようにしてスラッシュまでを切り詰める
Google Chrome 等であるようだが、リダイレクト等の挙動をキャシュしてしまうことがあるそうだ
Firefox のシークレットモードとかで確認してみるとよい
mod_rewrite の RewriteRule では
http://hogehogehoge.com/index.php?aaa=bbb&ccc=ddd
みたいな、パラメータがくっついた URL を変換することができない。
何故かと言うと、mod_rewrite では、この Query String(?以降の部分) と URL 部分(index.php の部分) は別扱いになるからである。
なのでパラメータ部分も含めた合致条件で変換する場合 RewriteRule ではなく RewriteCond のほうで条件指定してやる必要がある