【发布时间】:2018-09-10 11:57:38
【问题描述】:
我正在运行 IBM HTTP Server(不幸的是基于 Apache 2.2 版)来托管多个域。对于这些域,多年来积累了数千个手写 RewriteRules。这些规则位于特定于站点的配置文件中,这些文件包含在每个站点的两个 VirtualHost 部分中,一次用于端口 80,一次用于端口 443。
网络服务器没有直接连接到互联网。相反,它们前面有一个负载均衡器,它也终止 SSL 连接。这意味着我在端口 443 的 VirtualHosts 中设置了“SSLEngine off”。通过 HTTPS 在端口 443 上发送的请求仍会到达端口 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。
有什么想法吗?
【问题讨论】:
标签: apache redirect mod-rewrite https url-scheme