HSTS 和双重重定向

HSTS 和双重重定向

我在共享主机 LAMP 环境中管理一个小网站:这基本上意味着我唯一可以编辑的是 htaccess 文件。

我想添加 HSTS 支持(我也这么做了),但是,当我在这里测试了我的网站对于 HSTS 预加载资格,我收到以下错误:

错误:HTTP 首先重定向到 www

http://example(HTTP) 应立即重定向到https://example(HTTPS),然后再添加 www 子域。目前,第一个重定向是到https://www.example.需要额外的重定向以确保任何支持 HSTS 的浏览器都会记录顶级域的 HSTS 条目,而不仅仅是子域。

因此,我想我应该按以下方式重定向用户:

  1. http://example(这是用户在浏览器的地址栏中输入的内容)
  2. https://example(我们将他重定向到网站的 HTTPS 版本)
  3. 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

正如HSTS 预加载列表提交要求

  1. 如果您正在监听端口 80,则在同一主机上从 HTTP 重定向到 HTTPS。

您需要重定向到同一主机(即HTTP_HOST),而不是简单地先重定向到。如果用户直接请求,则example.com无需重定向到。(测试将涉及对 的请求。)之后,您可以根据需要重定向到规范的 www 子域。example.comwww.example.comexample.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 和域名顶点)。


进一步阅读:

相关内容