HSTS和双重重定向


9

我在共享托管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的正确方法是什么?并且:有任何风险吗?

Answers:


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]

这将创建一个重定向循环,因为前面的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服务器变量包含的值Host的HTTP请求报头(即,正被请求的任何主机)。

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

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

并且:有任何风险吗?

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


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

另外:(暂时忽略HSTS ...)这本身并不能完成,因为它不能规范化对请求的请求https://example.com/...(即HTTPS和域顶点)。


进一步阅读:


非常感谢,我会尽快对其进行测试。对最终Aside的快速答复:无论如何,它仍然可以工作,但似乎是我无法直接控制的东西(至少不在htaccess文件中:至少在托管服务提供商的网站管理员中有一个重定向面板)

1
顺便说一句,您的解决方案完全有效!:-)

1
“托管服务提供商网站管理员中的重定向面板”-我将始终对此类工具保持警惕。例如,cPanel中的redirects部分非常有限,而且臭名昭著。
MrWhite

1
这取决于您如何设置Strict-Transport-Security响应头。例如,要在重定向上进行设置,您将需要alwaysHeader伪指令上使用参数。我在Pro Webmasters堆栈上回答了一个相关问题(跳过我的答案的第一部分,关于on/ off),其中详细介绍了如何在中实现“ HSTS preload.htaccess
怀特先生(MrWhite)

1
别客气。老实说,Pro Webmasters堆栈可能更适合.htaccess仅涉及相关问题(ServerFault假定您对服务器具有完全控制权,在这种情况下,您不会在中进行此操作.htaccess)。可以说,使用单独的容器在服务器配置中实现此操作比较容易<VirtualHost>(因为您不需要搞乱env vars和其他条件 -它“更干净”并且更不容易出错)。如果您只能访问,我不建议您提交“预加载列表”提交.htaccess。(我的2c)
怀特先生
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.