我正在运行IBM HTTP Server(不幸的是基于Apache 2.2版)来托管多个域。对于这些领域,多年来积累了数以千计的手写RewriteRules。这些规则存在于特定于站点的配置文件中,这些文件包含在每个站点的VirtualHost部分中,一次用于端口80,一次用于端口443。
Web服务器未直接连接到Internet。相反,它们前面有一个负载均衡器,它也会终止SSL连接。这意味着我在VirtualHosts中为端口443“关闭了SSLEngine”。通过端口443上的HTTPS发送的请求仍然到达端口443上的Web服务器,只是未加密。
大多数RewriteRules具有以下形式:
RewriteRule ^/some-path/$ /some-other-path [L,R=301]
我现在发现,当通过HTTPS调用/ somepath时,这些重定向总是被破坏。例:
wget --max-redirect=0 -S --spider https://example.com/some-path
...
Location: http://example.com:443/some-other-path
如您所见,用户被重定向到端口443上的HTTP,毫不奇怪,用户不能与大多数客户端一起使用。谷歌浏览器显然是正确的尝试,但curl,wget,Firefox和Internet Explorer失败(这是正确的)。
我知道如何检测正确的协议并重写所有RewriteRules以做正确的事情。问题是,如果可能的话,我想避免这样做。我正在谈论超过8,000种不同形式的规则或多或少的“免费”格式。虽然我相当熟练使用Vim,但我希望会产生很多错误,这会导致更多的工作。
有没有办法可以强制RewriteRules协议而不在规则本身中指定协议?
我找到的唯一方法是删除所有规则中的L选项,并为修复协议的所有网站提供“最后”规则。但我不确定这是否会导致不可预见的影响,因为我强烈认为某些重定向目标将与之后的RewriteRules匹配。
有任何想法吗?
你试过了吗 :
RewriteRule ^/some-path/$ https://example.com/some-other-path [L,R=301]