如何使用 Apache 负载均衡器保留所有请求的代理 URL

如何使用 Apache 负载均衡器保留所有请求的代理 URL

我正在尝试使用负载均衡器通过代理机器向我的网站提供请求。当我尝试通过点击访问网站时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/

相关内容