我正在尝试使用 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