- 締切済み
リバースプロキシの開発ついての質問
apacheでリバースプロキシを開発をしています。(c言語) このプロキシは、リクエストを受けてユーザの属性を判別して後ろのサービスにリクエストを送る、というものです。 このリバースプロキシで質問なのですが、xml形式のリクエストをうけて、ある特定のユーザを判別した場合、リクエストのxmlにパラメータ(ユーザ1、2,3のようなフラグ)を追加して送りたいとかんがえているのですが、このようなことをすることは可能でしょうか? いまapacheのモジュールでこの処理をかいえているのですが、 リクエストを受信 → xmlのパース、解析 ー> ユーザの判別 ー> xmlにパラメータの追加 までの実装のめどは付いているのですが、 リクエストを受信 → xmlのパース、解析 ー> ユーザの判別 ー> xmlにパラメータの追加 ー> 追加したxmlで後ろのサービスにリクエストする 追加したxmlで後ろのサービスにリクエストするというのがどのようにすればいいのかがわかりません。(request_recの中のなんらかのパラメータに改ざんしたxmlをつけるのかなとはおもっているのですが・・・) 専門的なことになってしまい、答えにくいかもしれませんが、 1.リバースプロキシ上でリクエストを書き換えて後ろのサービスに送るのは可能か 2.わかるのであればどのようにすれば後ろのサービスに改ざんしたxmlを送れるのか を教えていただければ幸いです。アドバイス程度のものでも構いません。 宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Lchan0211b
- ベストアンサー率61% (573/930)
No.1です。 > リバースプロキシの処理自体はmod_rewriteでRewriteRuleで後ろに送っています。 えっ? mod_rewriteですか? mod_proxyじゃなくて? mod_rewriteでリクエスト先ホストを書き換えたら、 リバースプロキシ処理じゃなくてリダイレクト処理になりますよ。 リダイレクト処理は後方のサーバーにリクエストを中継するんじゃなくて、 ブラウザに30x系のエラーを返して新しいURLにブラウザから再接続 してもらう処理だと理解していますか? もし本当にリダイレクトしているのだったら、自作モジュールが リクエストを書き換えたとしても、結局ブラウザから転送先サイトに 再度リクエストするので、書き換えたリクエストは全く反映されない と思います。 > apacheの関数を使いPOSTのボディを取得することができ、リクエストのxmlをみて加工することができるのですが。 えっ、もしかしてApache1.3系を使ってますか? Apache1.3系ならap_get_client_blockでリクエストボディを書き換える ことができますが、Apache2.0以降はInputFilterを使わないとダメなはずです。 (参考) http://www.apache.jp/pipermail/apache-users/2003-May/002776.html Apache1.3はもう4年以上前にサポート終了していますし、 proxy系処理もあまりちゃんとしてなかったように思いますので Apache2.0以降にした方がよいと思います。 (参考) http://www.jpcert.or.jp/tips/2010/wr100501.html
- Lchan0211b
- ベストアンサー率61% (573/930)
リクエストを変更するapacheモジュールができているのであれば、 後は、リバースプロキシを構成したサーバーに そのモジュールを組み込めばよいだけだと思いますけど? http://module.jp/cookbook/apache_api/check_by_input_filter.html にあるようなInput Filterを実装したんですよね? リバースプロキシでリクエストを中継されるからといって その前段にあるモジュールが何か特別なことをしなければ ならないことはないと思います。 もしかしてリバースプロキシ処理も自前のモジュール内でやろうと しているということでしょうか? リバースプロキシ処理は奥が深い理ので、そこに関して特別な処理が 必要でなければ、そこはmod_proxyを組み合わせた方がよいと思います。 (参考) http://webos-goodies.jp/archives/51261261.html
補足
ご回答ありがとう御座います。助かります >もしかしてリバースプロキシ処理も自前のモジュール内でやろうと >しているということでしょうか? リバースプロキシの処理自体はmod_rewriteでRewriteRuleで後ろに送っています。 リクエスト → 自前のモジュール(ユーザ判定、xml処理、エラー表示)→ Rewriterule といった形です。 >リクエストを変更するapacheモジュールができているのであれば、 >後は、リバースプロキシを構成したサーバーに >そのモジュールを組み込めばよいだけだと思いますけど? こちらなんですが、apacheの関数を使いPOSTのボディを取得することができ、リクエストのxmlをみて加工することができるのですが。そのあとに、この加工したxmlでリクエストを飛ばすために自前モジュール内でPOSTのBODYを上書きしないといけないと思ったのですが,そのやり方がわからずといった感じです。もしかして、認識がおかしいでしょうか。。。 一応、POST Bodyの取得プログラムです、 static table *get_param_by_body(request_rec *r) { char *body; long length; char buff[HUGE_SRING_LEN]; int rsize, len_read; int rpos =0; if (ap_setup_client_block(r,REQUEST_CHUNKED_ERROR)) return NULL; if (!ap_should_client_block(r)) return NULL; length = r -> remaining; body = ap_pcalloc(r->pool, length +1); while(( len_read = ap_get_client_block(r, buff, sizeof(buff))) > 0) { if((rpos + len_read) > length) rsize = length -rpos; else rsize = len_read; memmove(body + rpos, buff , rsize); rpos += rsize; } return body; }