apache - 如何覆盖 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。
有任何想法吗?
解决方案
你试过了吗 :
RewriteRule ^/some-path/$ https://example.com/some-other-path [L,R=301]
推荐阅读
- npm - 检查 vuetify 的版本
- android - 从 Listview 的 url onclick 项目中流式传输音乐
- odoo - 为什么语法错误:在 odoo 9 中打印 QWEb (PDF) 时 JSON 中位置 0 的意外令牌 T?
- excel - 在 vba 编辑器中突出显示匹配的括号(括号)
- javascript - 选择文件后如何显示文件预览?
- google-signin - actions_intent_SIGN_IN 在 conv->user->profile 下没有配置文件数据
- angularjs - 如何在角度js中使用具有不同数字格式的货币格式
- ios - Swift 框架 - 构建后的 Header 和 Module 文件夹为空
- asp.net - 带有 ASP.NET Core WebAPI 的 Dart 中的令牌刷新并发问题
- powershell - PowerShell 中的竞争条件