2010年1月19日火曜日

apacheのRewriteEngine設定

こんにちわ、俺@仕事中です。
暇なんじゃないですよ。

今日はApache(2.0.59)のRewrite設定でハマったのでメモメモ。

Rewriteを有効にするには、apacheをインストールする時のconfigureオプションに
--enable-rewrite
をつけてmakeし、
httpd.conf(または.htaccess)に
RewriteEngine On
を書きます。

その後で「RewriteCond」と「RewriteRule」を書いてリダイレクトさせる条件やリダイレクト先などを書きます。
RewriteCond [値] [条件]
RewriteRule [URL正規表現] [Rewrite変換後]
RewriteCondは「ある条件を満たした場合にRewriteRuleを適用させる」という事をします。
例えばUser-AgentにDoCoMoが含まれていた場合に、http://foo.com/val_a/val_b を http://foo.com?a=val_a&b=val_bにRewriteさせるには、
RewriteEngine On
RewriteCond ${HTTP_USER_AGENT} DoCoMo
RewriteRule /(.*)/(.*) ?a=$1&b=$2
こんな感じです。(※未検証)

${HTTP_USER_AGENT}のように、利用できる環境変数は他にも
${HTTP_REFERER} ${HTTP_HOST} ${REMOTE_ADDR} ${SCRIPT_FILENAME} ${QUERY_STRING}
などなど多くあります。

一般的にRewriteは
http://foo.com/val_a/val_b/ というURLを http://foo.com/?a=val_a&b=val_bというURLに書き換えるために利用される事が多い(SEO対策など)のですが、今回ハマったのが
http://foo.com/val_a/?b=val_b というURLを http://foo.com?a=val_a&b=val_bというURLに書き換えようとした時です。
単純に、
RewriteRule ^/(.*)/\?b=(.*) /$1/$2
のようにしたのですが全く反映されません。
Rewriteログを取るために
RewriteLog logs/rewrite_log
RewriteLogLevel 3
とかやって見たのですが全然分かりませんでした。

Rewirteは「?(クエスチョンマーク)」がURL中にあると、それ以降をQuery_Stringとしてちょん切ってしまうので、「?(クエスチョンマーク)」以降のURLは解釈されないようなのです。
というので、上記のRewriteの場合は
RewriteRule ^/(.*)/(.*) /?a=$1&${QUERY_STRING}
として何とか対応しました。


いやー面倒でしたー。

0 件のコメント: