我在共享主机 LAMP 环境中管理一个小网站:这基本上意味着我唯一可以编辑的是 htaccess 文件。
我想添加 HSTS 支持(我也这么做了),但是,当我在这里测试了我的网站对于 HSTS 预加载资格,我收到以下错误:
错误:HTTP 首先重定向到 www
http://example
(HTTP) 应立即重定向到https://example
(HTTPS),然后再添加 www 子域。目前,第一个重定向是到https://www.example.
需要额外的重定向以确保任何支持 HSTS 的浏览器都会记录顶级域的 HSTS 条目,而不仅仅是子域。
因此,我想我应该按以下方式重定向用户:
http://example
(这是用户在浏览器的地址栏中输入的内容)https://example
(我们将他重定向到网站的 HTTPS 版本)https://www.example
(我们再次将他重定向到子域名 www)
我当前的重定向是这样完成的:
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
我尝试在最后一行之前添加重定向,如下所示:
RewriteRule ^(.*)$ https://example.com/$1 [R,L]
但我从浏览器收到“页面未正确重定向”错误。
那么,将用户从网站的 http 版本重定向到 https 并最终重定向到带有 www 的 https 的正确方法是什么?还有:有什么风险吗?
答案1
- 如果您正在监听端口 80,则在同一主机上从 HTTP 重定向到 HTTPS。
您需要重定向到同一主机(即HTTP_HOST
),而不是简单地先重定向到。如果用户直接请求,则example.com
无需重定向到。(测试将涉及对 的请求。)之后,您可以根据需要重定向到规范的 www 子域。example.com
www.example.com
example.com
我尝试在最后一行之前添加重定向,如下所示:
RewriteRule ^(.*)$ https://example.com/$1 [R,L]
这将创建一个重定向循环,因为前面的RewriteCond
指令仅适用于第一个RewriteRule
,所以第二个RewriteRule
将无条件运行。
请尝试以下类似操作:
# HTTP to HTTPS redirect
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L]
# Canonical www redirect
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R,L]
服务器HTTP_HOST
变量包含 HTTP 请求标头的值Host
(即正在请求的任何主机)。
第二次重定向状态为...对于所有请求的主机未以主机开头的请求,www.
则将其前缀www.
为主机。但是,如果您有多个子域(解析到同一个位置)并希望保持独立,那么这可能不可接受,因为它们自然会被重定向到 www 子域。
请注意,这些是 302(临时)重定向。只有当您确定它正常工作时才更改为 301。
并且:存在任何风险吗?
没有风险。是的,可能会有两次重定向,而以前可能只有一次(这可能效率较低)。但仍然只有两次重定向,这对于 SEO 来说完全没问题。此外,使用 HSTS,用户代理最多只会经历一次双重重定向。
RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
在旁边:(暂时忽略 HSTS...)这本身并不完整,因为它没有规范化请求https://example.com/...
(即 HTTPS 和域名顶点)。
进一步阅读:
- 我对 Pro Webmasters SE 上的相关问题的回答更详细地介绍了如何在以下位置实施 HSTS
.htaccess
:https://webmasters.stackexchange.com/a/112264/52912