2007年01月30日

Apache内のCGI環境変数をTomcatに渡す。

Apache内のCGI環境変数をTomcatに渡す。


Apache+Tomcatの環境で開発してるんですが
全般的に rewrite.conf を使ってURLの書き換えを行っているため
Tomcatからは、ユーザーが入力したURLが見れなくなっていて
そのことが問題になるケースに遭遇してしまいました。

ということで、この時の解決方法を記録しときます。
知ってれば大したことじゃないんだとは思いますが、、、
自分は知らなくて、数日ハマったので・・・orz


ちなみに本件は、apache2.2 + Tomcat 5.5 + mod_proxy_ajp を使ってます。


対応としては、一旦 mod_rewriteを使って、環境変数(偽)を、本当の(?)環境変数として登録してから、mod_headersを使って、本物の環境変数の値をRequestHeader に書き出すというものです。

以下は、QUERY_STRINGの値をORG_QUERY_STRING としてTomcat に転送する例です。
(ヘッダーのキー名は適当です。)

RewriteEngine On

RewriteRule ^(/.*)$ $1 [env=ORG_QUERY_STRING:%{QUERY_STRING}]
RequestHeader append "x-meke-original-query_string" %{ORG_QUERY_STRING}e

 

mod_rewrite のリファレンスを見ると%{変数名}という記述で、各種情報にアクセス可能っぽく見えるのですが、このうちの幾つかはmod_rewrite でしか使えない定数だったりします。(ヒドス)
http://blog.dawgsdk.org/weblog/archives/411011


そのため、以下のように書いても値をとることができません。

RequestHeader append "x-meke-original-query_string" %{QUERY_STRING}e

ちなみに mod_rewrite は、どうやって処理しているのかというと、、、mod_rewrite.c の1955行目あたりをみると、、、

if (!strcmp(var, "QUERY_STRING")) {
    result = r->args;
}


直接リクエスト構造体(?)から、値を返してるっ!!Σ(゜д゜|||)

たいていのモジュールは、%{変数名} の値の解決を、apr_table_getという関数のみで行っています。
これは、Apache内部の環境変数を保存するテーブルにアクセスする関数なんですが、初期状態では、このテーブルに値が入ってないのでイマイチ使えません。。。

mod_rewrite は%{変数名}の解決で、上記のテーブル以外の内部の値も使えるように拡張されているため、非常に強力になっています。

そして、mod_rewriteのenvオプションを使えば、apr_table_setn 関数を使って上記の環境変数のテーブルへ登録を行えるので、この処理の後であれば他のモジュールからも値が利用可能になるというカラクリです。

 

ていうか、Apache内の変数の名称が、「環境変数」っていうのは、検索の際にややこしすぎ、、、、orz



t100life at 17:14│Comments(0)TrackBack(0)clip!ハマリ(´ω`) 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔