
reqrep を使用して URI の一部を書き換えようとしています。
haproxy.cfg (オリジナル)
global
log 127.0.0.1 local2
daemon
maxconn 256
defaults
mode http
log global
option httplog
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend haproxy_in
bind *:8080
default_backend myapp
backend myapp
server app1 localhost:8123 check
これを実行すると、haproxy が期待どおりのログを記録します。POST を処理できないダミーの Python サーバーを使用しているので、501 は問題ではなく、要求がルーティングされたという事実だけを求めていることに注意してください。
haproxy_in myapp/app1 0/0/0/1/5 501 379 - - ---- 0/0/0/0/0 0/0 "POST /please/rewrite/this/ HTTP/1.1
また、サーバーログには次のようにも表示されます。
"POST /please/rewrite/this/ HTTP/1.1" 501 -
haproxy.cdf (reqrep 付き)
global
log 127.0.0.1 local2
daemon
maxconn 256
defaults
mode http
log global
option httplog
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend haproxy_in
bind *:8080
default_backend myapp
backend myapp
reqrep ^([^\ :]*\ /) "POST\ /test\ HTTP/1.1"
server app1 localhost:8123 check
reqrepを追加すると、haproxyからエラーメッセージが表示されます
haproxy_in myapp/<NOSRV> -1/-1/-1/-1/1 400 187 - - PR-- 0/0/0/0/3 0/0 "POST /please/rewrite/this/ HTTP/1.1"
どうやら私のリクエストは無効のようです。リクエストが haproxy から出ていないようです。リクエストが書き換えられた内容を確認するにはどうすればいいですか? 異なる正規表現を使用していくつかの異なる reqrep コマンドを試しましたが、すべて同じエラーが発生するようです。
私のhaproxyのバージョンは1.5.16です。
答え1
要求する3 つのパラメータを取ります<search> <string> <cond>
。
<search>
: は URL です。例: www.somedomain.com/please/rewrite/this/
<string>
: は置換文字列です。例: /test
<cond>
: は特別な条件用ですが、今は無視してください。
この例では、置換によって次の処理が実行されます。
FROM: http://www.somedomain.com/please/rewrite/this/
TO: /test
置換は次のようになります。
reqrep http://www.somedomain.com/please/rewrite/this/ http://www.somedomain.com/test
ドメインを無視して置換する場合は、正規表現で設定する必要があります。
reqrep ^([^\ :]*)\/please/rewrite/this/ \1\/test