HAProxy URL Rewrite が 400 Bad Request と NOSRV を返す

HAProxy URL Rewrite が 400 Bad Request と NOSRV を返す

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

関連情報