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

请求响应需要三个参数<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

相关内容