重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

apacheでリバースプロキシを開発をしています。(c言語)
このプロキシは、リクエストを受けてユーザの属性を判別して後ろのサービスにリクエストを送る、というものです。

このリバースプロキシで質問なのですが、xml形式のリクエストをうけて、ある特定のユーザを判別した場合、リクエストのxmlにパラメータ(ユーザ1、2,3のようなフラグ)を追加して送りたいとかんがえているのですが、このようなことをすることは可能でしょうか?

いまapacheのモジュールでこの処理をかいえているのですが、
リクエストを受信 → xmlのパース、解析 ー> ユーザの判別 ー> xmlにパラメータの追加

までの実装のめどは付いているのですが、

リクエストを受信 → xmlのパース、解析 ー> ユーザの判別 ー> xmlにパラメータの追加 
ー> 追加したxmlで後ろのサービスにリクエストする

追加したxmlで後ろのサービスにリクエストするというのがどのようにすればいいのかがわかりません。(request_recの中のなんらかのパラメータに改ざんしたxmlをつけるのかなとはおもっているのですが・・・)


専門的なことになってしまい、答えにくいかもしれませんが、
1.リバースプロキシ上でリクエストを書き換えて後ろのサービスに送るのは可能か
2.わかるのであればどのようにすれば後ろのサービスに改ざんしたxmlを送れるのか

を教えていただければ幸いです。アドバイス程度のものでも構いません。
宜しくお願いします。

A 回答 (2件)

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 …

Apache1.3はもう4年以上前にサポート終了していますし、
proxy系処理もあまりちゃんとしてなかったように思いますので
Apache2.0以降にした方がよいと思います。
(参考)
http://www.jpcert.or.jp/tips/2010/wr100501.html
    • good
    • 0

リクエストを変更するapacheモジュールができているのであれば、


後は、リバースプロキシを構成したサーバーに
そのモジュールを組み込めばよいだけだと思いますけど?

http://module.jp/cookbook/apache_api/check_by_in …
にあるような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;
}

補足日時:2014/06/08 16:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!