首先这些规则是错误的:
RewriteCond %{HTTP} off
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
您检查请求是否带有 htpps ,如果不是,您除了循环之外什么都不做,因为在这一行 RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 您不会将 http 更改为 https 。
我们把所有的规则都复制到这里,把第一个条件规则中的http改成https:
RewriteCond %{HTTP} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^\. [NC]
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
上述规则进行循环,因为每当第二个条件RewriteCond %{HTTP_HOST} !^\. [NC] 发生时,第一个条件RewriteCond %{HTTP} off 就会一次又一次地执行。
我们举个例子:
http://www.yourwebsite.com
此请求将由第一个条件处理,并将被重定向到:
https://www.yourwebsite.com
然后,它会被第二个条件处理,因为它可以通过它,并且会被重定向到:
http://www.yourwebsite.com
再次,第一个条件,然后是第二个等等。这将产生更多的循环。
像这样更改第一条规则:
RewriteCond %{HTTP} off
RewriteCond %{HTTP_HOST} ^\. [NC]
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
据我了解,您只想在这种情况下将请求 RewriteCond %{HTTP_HOST} ^\. 强制转换为 https,因为您将它们排除在外。
注意:确保在测试前清空浏览器缓存。