HSTS 和双重重定向

9 mod-rewrite .htaccess redirect hsts

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

我想添加 HSTS 支持(我做到了),但是,当我在这里测试我的网站是否符合 HSTS 预加载资格时,出现以下错误:

错误:HTTP 首先重定向到 www

http://example(HTTP)https://example在添加 www 子域之前应立即重定向到(HTTPS)。现在,第一个重定向是到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]
Run Code Online (Sandbox Code Playgroud)

我试图在最后一行之前添加一个重定向,这样:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]
Run Code Online (Sandbox Code Playgroud)

但我从浏览器收到“页面未正确重定向”错误。

那么,将用户从网站的 http 版本重定向到 https 并最终重定向到带有 www 的 https 的正确方法是什么?以及:有任何风险吗?

MrW*_*ite 10

HSTS 预加载列表提交要求所述

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

您需要重定向到同一主机(即HTTP_HOST),而不仅仅是example.com首先。example.com如果用户www.example.com直接请求,则不需要重定向到。(测试将涉及对 的请求example.com。)之后,如果需要,您可以重定向到规范的 www 子域。

我试图在最后一行之前添加一个重定向,这样:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]
Run Code Online (Sandbox Code Playgroud)

这将创建一个重定向循环,因为前面的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]
Run Code Online (Sandbox Code Playgroud)

所述HTTP_HOST服务器变量包含的值Host的HTTP请求报头(即,正被请求的任何主机)。

第二个重定向状态...对于所有请求,其中请求的主机未启动,www.然后www.是主机的前缀。但是,如果您有多个子域(解析到同一位置)想要保持分开,这可能是不可接受的,因为它们自然会被重定向到 www 子域。

请注意,这些是 302(临时)重定向。仅当您确定它工作正常时才更改为 301。

以及:有任何风险吗?

没有风险。是的,可能有两个重定向,而以前可能只有一个(可以说效率较低)。但是仍然只有两个重定向,这对于 SEO 来说是完全可以的。此外,使用 HSTS,用户代理最多只会经历一次双重重定向。


RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
Run Code Online (Sandbox Code Playgroud)

旁白:(暂时忽略 HSTS...)这本身并不完整,因为它没有规范化https://example.com/...(即 HTTPS 和域顶点)的请求。


进一步阅读: