mod_rewrite メモメモ - にぽたん研究所

August 19, 2004

このエントリーをはてなブックマークに追加
一昨日の夜中の 2 時頃、鼻歌 trickster 氏がハマっていた mod_rewrite ネタ。
あ、ちなみに相変わらず鼻歌 trickster 氏は鼻歌歌ってます。

reverse proxy の裏にある Apache にて、特定の IP アドレス以外全て Rewrite させるという処理を入れたい場合、環境変数 REMOTE_ADDR は proxy の IP アドレスになるので、当然それを RewriteCond に利用して、
RewriteCond %{REMOTE_ADDR} !^123\.45\.67\.89$
というのは出来ない。
なので proxy が付ける X-Forwarded-For ヘッダを利用するのですが、HTTP_X_FORWARDED_FOR 環境変数を利用しようと
RewriteCond %{HTTP_X_FORWARDED_FOR} !^123\.45\.67\.89$
としてみるがだめぽ。
HTTP_ な prefix を持つ環境変数 (リクエストヘッダ… r->headers_in な環境変数) を使うとしたら、通常
RewriteCond %{HTTP_REFERER}     ^http://www\.example\.com/foo/bar/.* [OR]
RewriteCond %{HTTP_USER_AGENT} !^Mozilla/[2-5]\..*
みたいなことが出来るんだから、HTTP_ な環境変数は普通に使えるのに何でだめぽ?と思ってました。
mod_rewrite.c を見てみたら、Rewrite で使用出来る一般的な環境変数は、環境変数から直接取得しているわけではなく、擬似的に環境変数と同名の引数から同等の値を取ってくるような処理が全てに施されていることが判明。。。

HTTP_ な環境変数も、ごく一般的なものだけサポートされているので、X-Forwarded-For のような一般的ではない環境変数 (というかリクエストヘッダ) は、
RewriteCond %{HTTP:X-Forwarded-For} !^123\.45\.67\.89$
みたいにしなくてはいけないようです。
他にも、環境変数で一般的なものはそのまま参照可能ですが、一般的ではないのは、
RewriteCond %{ENV:FOO_BAR} ...
のようにしなくてはいけないようです。

これって、やっぱ rewrite を行うフェーズのほうが環境変数をセットしたりとかのフェーズとかの前だったりして、参照出来ないからなのかしらん。←これテキトーな予想

うし、メモっておいたので、これでもうハマらないようにイキやしょう>PG チームのみなさん。

更に詳細メモメモ



■ rewrite の時、参照可能な HTTP_ 環境変数一覧
HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT

■ rewrite の時、参照可能なその他環境変数一覧
REMOTE_ADDR
REMOTE_PORT
REMOTE_HOST
REMOTE_USER
REMOTE_IDENT
THE_REQUEST
REQUEST_METHOD
REQUEST_URI
SCRIPT_FILENAME
REQUEST_FILENAME
PATH_INFO
AUTH_TYPE
IS_SUBREQ
DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
API_VERSION
TIME_YEAR
TIME

■ rewrite の時、環境依存で参照可能な環境変数一覧
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
SCRIPT_USER
SCRIPT_GROUP


ソース追ったから間違いねーべ (多分

nipotan at 20:49 | Comments(2) | TrackBack(0) | 技術 
このエントリーをはてなブックマークに追加

Trackback URL for this entry

Comments

1. Posted by nipotan   August 19, 2004 21:07
てか mod_rpaf とか mod_extract_forwarded 使えと小一時間 (ry
2. Posted by takah   August 20, 2004 08:05
proxy側で制御してればはまることもなかったのにね。。

%{ENV:FOO_BAR}は頭の片隅にいれとこ。

Post a comment

Name:
URL:
  Remember info?: Rate: Face    Star