重定向 URL 中出现的 Apache 端口号

重定向 URL 中出现的 Apache 端口号

编辑:已解决

编辑:将 8443 替换为 8043(以修复与 Shibboleth SP 的潜在端口号冲突)

我正在尝试将 Apache (apache 2.4) 更改为监听端口 8080 和 8043,而不是 80 和 443(这样我就不需要 sudo/root 来启动它了)。不过,前面的 F5 BigIP 负载平衡器设备会监听 80 和 443,并将最终用户的负载平衡到 Web 服务器上的 8080 和 8043。

然而,当 Web 浏览器访问我们的网站时(例如https://foo.bar/)我们的 Apache 配置导致它使用 8043 端口号重定向!(例如https://foo.bar:8043/baz/)。这当然会超时(因为 foo.bar 解析为 F5 BigIP 设备的 IP,而该 IP 在端口 8043 上没有任何内容)。

相关的 Apache 配置如下所示:

<Proxy balancer://UM>
        Order deny,allow
        Allow from all
        BalancerMember ajp://10.25.145.130:8010 route=a keepalive=On disablereuse=On
        BalancerMember ajp://10.25.145.131:8010 route=b keepalive=On disablereuse=On
        ProxySet lbmethod=bybusyness stickysession=UMLB nofailover=Off
        SetEnvIf Cookie UMLB HAVE_UM_ROUTE
        Header add Set-Cookie "UMLB=x.%{BALANCER_WORKER_ROUTE}e;path=/;" env=!HAVE_UM_ROUTE
</Proxy>

<Proxy balancer://IDP>
        Order deny,allow
        Allow from all
        BalancerMember ajp://10.25.145.130:8009 route=a keepalive=On disablereuse=On
        BalancerMember ajp://10.25.145.131:8009 route=b keepalive=On disablereuse=On
        ProxySet lbmethod=bybusyness stickysession=IDPLB nofailover=Off
        SetEnvIf Cookie IDPLB HAVE_IDP_ROUTE
        Header add Set-Cookie "IDPLB=x.%{BALANCER_WORKER_ROUTE}e;path=/;" env=!HAVE_IDP_ROUTE
</Proxy>

<VirtualHost *:8043>
        ServerName foo.bar
        DocumentRoot /var/www/html

        ProxyPass /idp balancer://IDP/idp
        ProxyPass /UserManagement balancer://UM/UserManagement

        SSLEngine on
</VirtualHost>

编辑(附加信息)

查看 HTTP 跟踪(chrome 插件),我发现有几个重定向都工作正常,但是一旦到达这里它就会失败并最终使用端口 8043 重定向(这就是它失败的原因,如果我在重定向后手动删除 URL 中的 :8043 它就可以正常工作)

GET https://foo.bar/idp/AuthnEngine
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36
Referer: https://foo.bar/idp/profile/SAML2/Redirect/SSO?SAMLRequest=blahblahblah
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,de;q=0.6
Cookie: JSESSIONID=blahblahblah; _idp_authn_lc_key=blahblahblah; IDPLB=x.b; BIGipServerblahblah=blahblahblah

HTTP/1.1 302 Moved Temporarily
 Redirect to: https://foo.bar:8043/UserManagement/private/Login?redirectURL=blahblahblah
Date: Tue, 05 Jan 2016 18:32:32 GMT
Expires: 0
Cache-Control: no-cache, no-store, must-revalidate, max-age=0
Pragma: no-cache
Set-Cookie: _pid_domain=blahblah; Domain=bar.com; Path=/; Secure
Location: https://foo.bar:8043/UserManagement/private/Login?redirectURL=blahblahblah
Content-Length: 0
Keep-Alive: timeout=15, max=98
Connection: Keep-Alive
Content-Type: text/plain; charset=UTF-8

由于后端 tomcat 应用程序在其中提供 8043 的重定向,我认为 ProxyPassReverse 是正确的解决方案,因此我尝试了以下操作:(没有用,结果相同)

ProxyPass /idp balancer://IDP/idp
ProxyPassReverse /idp https://foo.bar/idp

ProxyPass /UserManagement balancer://UM/UserManagement
ProxyPassReverse /UserManagement https://foo.bar/UserManagement

还尝试了以下方法(结果相同):

ProxyPass /idp balancer://IDP/idp
ProxyPassReverse /idp balancer://IDP/idp

ProxyPass /UserManagement balancer://UM/UserManagement
ProxyPassReverse /UserManagement balancer://UM/UserManagement

甚至尝试了 ProxyPassReverse 的虚假 URL,只是为了看看它是否有任何效果,但事实并非如此!HTTP 跟踪结果相同,它不会调整后端应用程序重定向的 URL。

这里发生了什么?

谢谢,本

答案1

检查你的重定向链接是否指向 foo.bar

然后将您的配置更改为:

...
<VirtualHost *:8443>
ServerName foo.bar
...

NameVirtualHost 指令不再有任何作用,除了发出警告。出现在多个虚拟主机中的任何地址/端口组合都将被隐式视为基于名称的虚拟主机。

Apache 2.4 更新

并且不要忘记在 Apache 配置中监听端口 8443

Listen 8443

答案2

所以我放弃了让 ProxyPassReverse 与 AJP 合作。不过,我发现了一种真正有效的方法!

<Location "/idp">
                ProxyPass balancer://IDP/idp
                Header edit Location foo.bar:8043 foo.bar
</Location>

这将从 HTTP 302 临时重定向的位置标头中删除 :8043。ProxyPassReverse 应该执行此操作,但显然无法与 AJP 和 Balancer 正常配合使用,至少在我的设置中是这样。

相关内容