通过 .htaccess 在一个页面上强制 SSL,无需循环

通过 .htaccess 在一个页面上强制 SSL,无需循环

好的,我有这个代码:

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/borrowing/ill/request\.php$
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

我期望它的工作方式是:

  1. /borrowing/ill/request.php 的请求通过 HTTP 发出。
  2. 规则匹配。
  3. 服务器重定向到 HTTPS。
  4. 规则不匹配,因为 HTTPS 现已启用。

它的实际工作方式是:

  1. /borrowing/ill/request.php 的请求通过 HTTP 发出。
  2. 规则匹配。
  3. 服务器重定向到 HTTPS。
  4. 规则匹配。
  5. 服务器重定向到 HTTPS。
  6. 规则匹配。
  7. 服务器重定向至 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]

相关内容