我有两种配置 - 开发和暂存 - 具有(据称)相同的配置:一组仅 HTTP 的 Apache 实例位于 Citrix 负载均衡器后面,允许 HTTP 和 HTTPS 连接。
Apache VirtualHost 定义包含以下指令:
RedirectMatch permanent /something/endpoint(.*)$ /something/otherendpoint$1
SSLProxyEngine On
ProxyPass /something/endpoint !
ProxyPass /something https://192.168.1.100:6443/something
<Location /something>
ProxyPassReverse https://192.168.1.100:6443/something
</Location>
因此,我想要将 的所有请求代理/something
到不同的后端 HTTPS 服务器,但 除外/something/endpoint
,我需要重定向。
现在,我的开发环境中一切正常。我可以访问http://hostname/something/endpoint
,它会将我重定向到http://hostname/something/otherendpoint
。同样,我可以访问https://hostname/something/endpoint
,它会将我重定向到https://hostname/something/otherendpoint
。
但在暂存环境中,http://hostname/something/endpoint
和https://hostname/something/endpoint
重定向到http://hostname/something/otherendpoint
- 它不保留 HTTPS。
我一直在绞尽脑汁想找出这两种配置之间的区别。肯定是某些原因导致 Apache 不遵守访问协议,但我无法找出原因。HTTP 响应标头在两种环境中看起来相同,除了Location
指定http
而不是的重定向标头https
。
对于哪些配置差异可能导致这种情况,您有什么想法吗?
答案1
请记住,永久重定向会被您的网络浏览器缓存,您需要在每次测试/修改配置后手动清除浏览器缓存,或者在“隐身”/“匿名”浏览器窗口中进行测试。
如何apache httpd 合并配置指令可能有点棘手。您使用的语法似乎有点不一致,这可能是导致问题的原因:
ProxyPass /something https://192.168.1.100:6443/something
<Location /something>
ProxyPassReverse https://192.168.1.100:6443/something
</Location>
为了清楚起见,请使用:
ProxyPass /something/endpoint !
ProxyPass /something https://192.168.1.100:6443/something
ProxyPassReverse /something https://192.168.1.100:6443/something
或者将所有内容包含在 Location
指令中:
<Location /something>
ProxyPass https://192.168.1.100:6443/something
ProxyPassReverse https://192.168.1.100:6443/something
</Location>
<Location /something/endpoint>
ProxyPass "!"
Redirect permanent /something/otherendpoint
</Location>