繁体   English   中英

.htaccess文件没有重定向http:// www。 到https:// www

[英].htaccess file not redirecting http://www. to https://www

我制作了一个.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上的一些帖子,但他们的大部分解决方案都以重定向循环错误结束。

在联系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。

 RewriteEngine On RewriteCond %{HTTP_HOST} !^www\\.example\\.com [NC] RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L] 

如您www.example.com ,无论是HTTP还是HTTPS,在请求规范主机名(即www.example.com )时都不会重定向。

您需要将其更改为:

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.example\.com
RewriteRule (.*) https://www.example.com/$1 [R=301,L]

如果HTTPS“关闭” 或者它不是规范主机名,这将触发重定向到规范URL。

...但他们的大多数解决方案都以重定向循环错误结束。

如果您在管理SSL证书的代理(例如CloudFlare)后面,那么这仍然可能导致重定向循环,因为您和代理之间的连接可能是HTTP,而不是HTTPS。 这意味着您的服务器仅通过HTTP提供内容,而不是HTTPS。 如果是这种情况,则可以在请求中检查其他标头(例如, X-Forwarded-Proto )或在CloudFlare(灵活SSL - 免费服务)的情况下设置“页面规则”。


更新#1: 123-Reg提供有关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_HTTPSAPACHE_SSLAPACHE_PROTO (例如,在PHP中,使用getenv()函数。)

经过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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM