
apacheでリバースプロキシを開発をしています。(c言語)
このプロキシは、リクエストを受けてユーザの属性を判別して後ろのサービスにリクエストを送る、というものです。
このリバースプロキシで質問なのですが、xml形式のリクエストをうけて、ある特定のユーザを判別した場合、リクエストのxmlにパラメータ(ユーザ1、2,3のようなフラグ)を追加して送りたいとかんがえているのですが、このようなことをすることは可能でしょうか?
いまapacheのモジュールでこの処理をかいえているのですが、
リクエストを受信 → xmlのパース、解析 ー> ユーザの判別 ー> xmlにパラメータの追加
までの実装のめどは付いているのですが、
リクエストを受信 → xmlのパース、解析 ー> ユーザの判別 ー> xmlにパラメータの追加
ー> 追加したxmlで後ろのサービスにリクエストする
追加したxmlで後ろのサービスにリクエストするというのがどのようにすればいいのかがわかりません。(request_recの中のなんらかのパラメータに改ざんしたxmlをつけるのかなとはおもっているのですが・・・)
専門的なことになってしまい、答えにくいかもしれませんが、
1.リバースプロキシ上でリクエストを書き換えて後ろのサービスに送るのは可能か
2.わかるのであればどのようにすれば後ろのサービスに改ざんしたxmlを送れるのか
を教えていただければ幸いです。アドバイス程度のものでも構いません。
宜しくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.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
No.1
- 回答日時:
リクエストを変更する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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
stable diffusionのエラー
-
正規表現で、青空文庫形式の入...
-
libreあればopen office削除し...
-
csvデータのダブルクォーテーシ...
-
pycharmへのpysamインストール...
-
5000個のtiffファイルをpdfへ変...
-
QRコードの作成方法について
-
アクオス
-
FlowchartのMDファイルをPNG化...
-
この話は本当? 中華AI「DeepSe...
-
(大学)数学の質問をするために...
-
特許公報のPDFから項目毎にExce...
-
Xamppはオープンソースのディス...
-
OSS(オープンソースソフトウェ...
-
みなさん、mvなどはどのアプリ...
-
Webサイトのビデオプレーヤーに...
-
研究する文献がたくさんありま...
-
研究する文献がたくさんありま...
-
chatgpt 4oを使っています。あ...
-
【abc】に【完全一致】する正規...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Apacheを複数のhttpd.confを用...
-
apache/mod_perlの実行エラーに...
-
Seleniumの要素指定について
-
簡単にEXEファイルを作れるプロ...
-
ftpコマンドの戻り値をチェック...
-
フォルダ内のファイルをコピペ
-
ISOファイルの編集方法
-
マイナポータルの住宅借入金当...
-
ファイル名を変更前の名前に戻す方
-
複数時間情報の重複を求める
-
秀丸エディタでのファイル分割
-
JCL(富士通/MSP)について教...
-
VBAのzip解凍についてのご質問です
-
zipファイルが開けません。
-
HPビルダー6について
-
コマンドプロンプト "expand" ...
-
ホームページビルダー
-
UnlhaExtractMemの画面表示
-
warファイル 「種類:WAR ファ...
-
ファイル名のリストを出力した...
おすすめ情報