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

Posted

技术标签:

【中文标题】.htaccess 文件不重定向 http://www。到 https://www【英文标题】:.htaccess file not redirecting http://www. to https://www 【发布时间】:2017-09-08 04:28:25 【问题描述】:

我制作了一个 .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版本。

谁能帮我理解为什么其他重定向工作正常,但那个不是?

附加说明:我查看了 *** 上的一些帖子,但他们的大多数解决方案都以重定向循环错误结束。

【问题讨论】:

关于“重定向循环” - SSL 证书是如何管理的? @w3dk SSL 证书由我的网站托管公司 (123-Reg) 管理。它已被购买以覆盖 www.example.com。它不是通配符。 我认为这只是一个错字,但http://www.example.com -> http://www.example.com 应该是http://www.example.com -> https://www.example.com(带有s)。而前面的“重定向”https://www.example.com -> https://www.example.com 根本不是重定向,因为在这种情况下应该不会发生 nothing 抱歉,我没有说清楚。我输入http://www.example.com -> http://www.example.com 来显示正在发生的事情,而不是我想要发生的事情!所以是的,我希望 http://www. 重定向到 https://www. 基本上,我希望所有内容都重定向到https://www.example.com 【参考方案1】:

在 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

【讨论】:

这与接受的答案中提供的代码相同。但是,您应该避免编辑 # BEGIN WordPress 部分中的代码,因为 WordPress 本身会尝试管理此部分,并且您的自定义指令可能会被覆盖。【参考方案2】:

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

【讨论】:

感谢您的反馈。然而,123-Reg 提出的解决方案还不是最优的。第一个 RewriteRule 应该重定向到 HTTPS,否则在请求 http://example.com 时会出现不必要的双重重定向。第二个 RewriteRule 应该是 301,否则它不会向搜索引擎发送正确的 msg,浏览器也不会缓存它。第一个 RewriteRule 上的 NC 标志是不必要的。【参考方案3】:
RewriteEngine On
RewriteCond %HTTP_HOST !^www\.example\.com [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

如您所见,无论是 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 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_HTTPSAPACHE_SSLAPACHE_PROTO。 (例如,在 PHP 中,使用 getenv() 函数。)

【讨论】:

感谢您的回复@w3dk。我这样实现了你的建议:RewriteEngine On RewriteCond %HTTP:X-Forwarded-Proto !https RewriteCond %HTTPS off [OR] RewriteCond %HTTP_HOST !^www\.example\.com [NC] RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L] 在测试了不同的方法之后,每当执行 [OR] 语句时,就会发生重定向错误。如果删除,则不会出现重定向错误,但仍然不会重定向http://www. 如果您购买了 SSL 证书来覆盖您的域(我假设这必须同时覆盖 example.comwww.example.com),那么您就不必检查 %HTTP:X-Forwarded-Proto。你当然不应该同时检查%HTTP:X-Forwarded-Proto %HTTPS - 它们是相互排斥的。我已经更新了关于 123-Reg 的答案 - 可能需要不同的方法。 我真的很感谢你在这个问题上的时间@w3dk。我已经使用了您在这篇文章中找到的内容 - ***.com/questions/34310560/… 不幸的是,我仍然收到相同的“www.example.com 将您重定向太多次”。每当我添加有关 HTTPS 或 [OR] 语句的行时都会出现错误消息:( P.S. 我一直在使用隐身浏览器和其他浏览器来对抗缓存。 这是我试过的:RewriteEngine On RewriteCond %ENV:SSL !1 RewriteCond %HTTP_HOST !^www\.example\.com RewriteRule (.*) https://www.example.com/$1 [R=301,L] 我已经提交了来自 123-Reg 的回复作为答案。与您的建议相去不远。他们使用ENV:HTTPS 而不是ENV:SSL 并将其分为两个步骤。感谢您的帮助!

以上是关于.htaccess 文件不重定向 http://www。到 https://www的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess 不重定向到 404.php 而是显示页面名称

高分请教.htaccess规则写法..URL 301

在 apache 中创建一个不重定向的重写查询字符串

wordpress 和 htaccess 301 重定向没有管理员

如何使用 htaccess 将多个域重定向到除 1 个目录之外的另一个域?

为啥下面的系统调用输出不重定向到文件?