如何为RewriteRules覆盖协议

时间:2018-09-10 11:57:38

标签: apache redirect mod-rewrite https url-scheme

我正在运行IBM HTTP Server(不幸的是,基于Apache 2.2版)来托管多个域。对于这些域,多年来积累了数千个手写的RewriteRules。这些规则存在于特定于站点的配置文件中,该文件包含在每个站点的两个VirtualHost部分中,一次用于端口80,一次用于端口443。

Web服务器未直接连接到Internet。相反,它们前面有一个负载平衡器,该负载平衡器也终止SSL连接。这意味着我在VirtualHosts的端口443中具有“ 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相匹配。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您尝试过吗:

RewriteRule ^/some-path/$  https://example.com/some-other-path [L,R=301]