首页 > 解决方案 > 如何覆盖 RewriteRules 的协议

问题描述

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

Web 服务器不直接连接到 Internet。相反,它们前面有一个负载均衡器,它也终止 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。

有任何想法吗?

标签: apacheredirectmod-rewritehttpsurl-scheme

解决方案


你试过了吗 :

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

推荐阅读