我制作了.htaccess文件,将所有网站流量重定向到https://www.
。
这是我完整的.htaccess文件:
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
以下重定向的工作方式完全符合预期:
http://example.com -> https://www.example.com
https://example.com -> https://www.example.com
https://www.example.com -> https://www.example.com
除
http://www.example.com -> http://www.example.com
如上所示,如果您转到http://www.
,则不会重定向到HTTPS版本。
任何人都可以帮助我理解为什么其他重定向工作正常,但那个重定向不是吗?
附加说明:我查看了StackOverflow上的一些帖子,但他们的大多数解决方案都以重定向循环错误结束。
答案 0 :(得分:3)
在联系123-Reg(我的托管服务提供商)后,他们提交了此解决方案,该方案运行良好:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301,NC]
RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
基本上,他们已将脚本设置为执行两项任务:将域更改为WWW
,如果尚未更改为HTTPS
。此外,他们使用了ENV:HTTPS
,这与他们的文档(ENV:SSL
)中的内容不同。
很高兴有这个排序,也许这会帮助其他人使用123-Reg Hosting。
答案 1 :(得分:0)
RewriteEngine On RewriteCond %{HTTP_HOST} !^www\.example\.com [NC] RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
正如您所发现的那样,在请求规范主机名(即www.example.com
)时,无论是HTTP还是HTTPS,都不会重定向。
您需要将其更改为:
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.example\.com
RewriteRule (.*) https://www.example.com/$1 [R=301,L]
如果HTTPS为" off"这将触发重定向到规范网址。 或它不是规范的主机名。
...但他们的大多数解决方案都以重定向循环错误结束。
如果您在管理SSL证书的代理(例如CloudFlare)后面,那么这仍然可能导致重定向循环,因为您和代理之间的连接可能是HTTP,而不是HTTPS。这意味着您的服务器仅通过HTTP提供内容,而不是HTTPS。如果是这种情况,则可以在请求中检查其他标头(例如X-Forwarded-Proto
)或设置"页面规则"在CloudFlare(灵活的SSL - 免费服务)的情况下。
更新#1: 123-Reg provide a help document regarding SSL。当"连接是SSL安全的"时,他们似乎设置了SSL
环境变量。这意味着您可能会执行以下操作:
RewriteCond %{ENV:SSL} ^$ [OR]
RewriteCond %{HTTP_HOST} !^www\.example\.com
RewriteRule (.*) https://www.example.com/$1 [R=301,L]
然而,这是非标准的,并且"独特的"至123-Reg。 (旁白: 123-Reg链接文档中的PHP代码建议不是检查环境变量的推荐方法,因为如果未设置变量,这将导致E_NOTICE!)
您还应确保在测试前清除浏览器缓存。
更新#2:为了帮助调试... 以找出返回的值,您可以为环境变量分配一些Apache值,并在服务器端检查这些值的值脚本(例如PHP?)。例如:
RewriteCond %{HTTPS} (.*)
RewriteRule ^ - [E=APACHE_HTTPS:%1]
# You don't really need this, but for completeness...
RewriteCond %{ENV:SSL} (.*)
RewriteRule ^ - [E=APACHE_SSL:%1]
RewriteCond %{HTTP:X-Forwarded-Proto} (.*)
RewriteRule ^ - [E=APACHE_PROTO:%1]
然后检查服务器端脚本中的环境变量APACHE_HTTPS
,APACHE_SSL
和APACHE_PROTO
。 (例如,在PHP中,使用getenv()函数。)
答案 2 :(得分:0)
在使用123 Reg和使用Wordpress将所有版本的页面重定向到单个相关的https页面之后出现了很多问题,这是我现在在多个站点上工作的,并且已经证明在SEO方面有效。希望它有所帮助!
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress