我安装了 haproxy 1.4,需要在 haproxy.conf 中配置反向代理,将 URL 从 www.somedomain.com
重写为 www.otherdomain.com/bla/ble
。我正在编写的配置在这里:
acl cpol_acl hdr_dom(host) -i www.somedomain.com
use_backend cpol_srv if cpol_acl
backend cpol_srv
balance leastconn
mode http
option httplog
stick on src
stick-table type ip size 10240k expire 60m
reqirep ^([^\ :]*)\ /(.*) \1\ /bla/ble\2
reqirep ^Host:\ www.somedomain.com Host:\ www.otherdomain.com
server cpol_srv www.otherdomain.com check port 80
这是有效的,但浏览器中的 URL 确实会重写为 www.otherdomain.com/bla/ble
这不是我想要的。如果我删除该行
reqirep ^([^\ :]*)\ /(.*) \1\ /bla/ble\2
我只能转发到主机 www.otherdomain.com
,但浏览器中的 URL 仍为 www.somedomain.com
。
有没有办法在不重写浏览器 URL 的情况下进行这种类型的反向代理?
PS:我会做这种 Apache 风格(可行),但机器没有任何通往外部世界的 NAT,只能与 haproxy 通信。
最佳答案
好吧,过了一会儿我想出了必须做什么。
仅更改请求是不够的,还必须将响应更改回原始请求主机。它还创建了一个 acl 来防止重复目录 url 部分“/bla/ble”。坚持上面的例子,应该像这样完成:
acl cpol_acl hdr_dom(host) -i www.somedomain.com
use_backend cpol_srv if cpol_acl
backend cpol_srv
balance leastconn
mode http
option httplog
stick on src
stick-table type ip size 10240k expire 60m
**acl no_redir url_beg /bla/ble/**
reqirep ^Host:\ www.somedomain.com Host:\ www.otherdomain.com
reqirep ^([^\ :]*)\ /(.*) \1\ /bla/ble\2 **if !no_redir**
**rspirep ^([^\ :]*)\ (.*)www.otherdomain.com/bla/ble/(.*) \1\ \2www.somedomain.com/\3**
server cpol_srv www.otherdomain.com check port 80
关于reverse-proxy - 多个 reqirep haproxy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13649798/