August 19, 2004
一昨日の夜中の 2 時頃、鼻歌 trickster 氏がハマっていた mod_rewrite ネタ。
あ、ちなみに相変わらず鼻歌 trickster 氏は鼻歌歌ってます。
reverse proxy の裏にある Apache にて、特定の IP アドレス以外全て Rewrite させるという処理を入れたい場合、環境変数
なので proxy が付ける X-Forwarded-For ヘッダを利用するのですが、
mod_rewrite.c を見てみたら、Rewrite で使用出来る一般的な環境変数は、環境変数から直接取得しているわけではなく、擬似的に環境変数と同名の引数から同等の値を取ってくるような処理が全てに施されていることが判明。。。
他にも、環境変数で一般的なものはそのまま参照可能ですが、一般的ではないのは、
これって、やっぱ rewrite を行うフェーズのほうが環境変数をセットしたりとかのフェーズとかの前だったりして、参照出来ないからなのかしらん。←これテキトーな予想
うし、メモっておいたので、これでもうハマらないようにイキやしょう>PG チームのみなさん。
更に詳細メモメモ
あ、ちなみに相変わらず鼻歌 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
ソース追ったから間違いねーべ (多分