我正在尝试使用负载均衡器通过代理机器向我的网站提供请求。当我尝试通过点击访问网站时http://PROXYSERVER.com,主页显示正常,保留地址栏 URLhttp://PROXYSERVER.com。
现在,当我尝试访问内部链接(例如 http://PROXYSERVER.com/services/)时,地址栏 URL 会更改为 APPSERVER URL http://APPSERVER01.com/services/
注意:页面显示正常,但地址栏 URL 正在发生变化。
预期行为是当用户请求 http://PROXYSERVER.com/services/ 时,地址栏应在处理请求时保留代理 URL
这是我的负载平衡代码,
ProxyRequests off
ServerName PROXYSERVER.com
# WebHead1
BalancerMember http://APPSERVER01:80/ route=node1
# WebHead2
BalancerMember http://APPSERVER02:80/ route=node2
Order Deny,Allow
Deny from none
Allow from all
ProxySet lbmethod=byrequests
#ProxySet lbmethod=bybusyness
ProxySet stickysession=BALANCEID
SetHandler balancer-manager
Order deny,allow
Allow from all
# Point of Balance
ProxyPass /balancer-manager !
ProxyPass / balancer://mycluster/
任何建议都将受到赞赏。
答案1
您发布的配置和您描述的症状表明缺少ProxyPassReverse
指示。
如果没有它,你们两个应用服务器发送的 HTTP 重定向响应中的 Location、Content-Location 和 URI 标头中的任何 URL 都不会被修改。这会暴露应用服务器的真实名称/URL,访问者将被定向到该 URL,而不是代理服务器的 URL。
例如,当您转到目录http://example.com/dirname
并省略尾部斜杠时,您会看到此类标头/。
在这种情况下,活动应用程序服务器将发送 HTTP 301“永久移动”标头并附加尾部斜杠。
跟踪curl -v proxyserver.com/services
将显示以下内容:
> GET /services HTTP/1.1
> Host: proxyserver.com
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Date: Wed, 06 Jan 2016 09:27:31 GMT
< Server: Apache/2.2.15 (CentOS)
< Location: https://appserver01:/services/
< Content-Length: 328
< Connection: close
< Content-Type: text/html; charset=iso-8859-1
<
您可以通过添加正确的 ProxyPassReverse 指令来解决这个问题,该指令告诉 Apache 使用代理 URI 的标头重写此类标头
# Point of Balance
ProxyPass /balancer-manager !
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
根据你运行的 Apache 版本,你可能会遇到类似以下行为 这个较旧的错误并且可以为平衡器池的每个成员尝试明确的 ProxyPassReverse 指令:
ProxyPass /balancer-manager !
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
# Ensure that headers sent by application servers get corrected:
ProxyPassReverse / http://APPSERVER01:80/
ProxyPassReverse / http://APPSERVER02:80/