好的,我有这个代码:
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/borrowing/ill/request\.php$
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
我期望它的工作方式是:
- /borrowing/ill/request.php 的请求通过 HTTP 发出。
- 规则匹配。
- 服务器重定向到 HTTPS。
- 规则不匹配,因为 HTTPS 现已启用。
它的实际工作方式是:
- /borrowing/ill/request.php 的请求通过 HTTP 发出。
- 规则匹配。
- 服务器重定向到 HTTPS。
- 规则匹配。
- 服务器重定向到 HTTPS。
- 规则匹配。
- 服务器重定向至 HTTPS ...
等等。
我知道第二个条件(匹配文件名)有效,因为重定向循环只会命中该特定页面。问题是,为什么切换到 HTTPS 不会导致第一个条件不匹配?
编辑:
我将完全相同的 .htaccess 规则放入另一台服务器上的测试区域 - 相同的文件和路径信息。它们起作用了正好。服务器其他地方的配置肯定有问题。
答案1
事实证明,上面的代码没有任何问题。问题是我执行该代码的服务器正在与仅在端口 80 上通信的负载平衡器通信。
因此,HTTPS 请求从端口 443 进入,到达负载均衡器,负载均衡器将其重定向到端口 80。然后,Web 服务器将其重定向回 443,然后重定向到 80、443、80、443...
因此,解决方法是将其报告给维护负载平衡器的人员,并希望他们能够解决问题。
无论如何,感谢你们的帮助,你们都非常有耐心。
答案2
如果目标域已知,请尝试以下操作:
RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{REQUEST_URI} ^/borrowing/ill/request\.php$
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]