301使用HSTS预载标头重定向到WWW

时间:2019-03-15 20:37:41

标签: .htaccess redirect http-status-code-301 hsts

我打算对HSTS进行预加载,并看到以下标头。没问题。可以。

Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS

HSTS预加载的条件是,我还将所有HTTP通信都重定向到HTTPS。为此,我使用以下指令:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

这也可行。如果它在hstspreload.org测试了我的根域(example.com),我会看到绿色,并且可以将我的域添加到预加载列表中。请注意,这太好了。

我想将网站加载到https://www.example.com,而不是https://example.com。这个应该很简单:

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

如果返回到hstspreload.org,我会收到以下错误消息:

  

响应错误:响应中不存在HSTS标头。

当我在hstspreload.org栏中输入任何子域时,我看到绿色。它仅在收到错误的根域上,因为似乎根域不再发送HSTS标头。但是,根域必须发送标头是预先加载的条件。

我做了作业并进行了搜索。我几年前读过this post,但我的问题不是关于SEO。而且,Google可以进行两次重定向-一次从HTTP重定向到HTTPS,一次从重定向到。

我很有信心可以进行HSTS预加载和WWW重定向。 Troyhunt.com重定向到HTTPS,然后重定向到WWW。根域也在hstspreload.org上进行验证。但是,我相信他使用IIS,所以问他在Apache上做什么对我无济于事。

我将不胜感激。我正在尝试,但我还是一个初学者。谢谢!

2 个答案:

答案 0 :(得分:0)

要在重定向中包含标头,您需要添加always属性:

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS

我也不确定何时设置env=HTTPS-可能在重定向发生后设置了,所以上面的方法不起作用?

说实话,我通常将HSTS设置放在SSL中 vhost,因此它仅适用于HTTPS连接,而不是尝试使用env=HTTPS变得更聪明。

如果您有多个SSL虚拟主机,则这将使您拥有不同的HSTS-例如,在基础域上没有includeSubDomains,而在www域上却拥有它。如果您尚未将非www域迁移到HTTPS,这将很有用。但是,对于预加载,您必须在基础域和www域上都拥有includeSubDomains,因此这可能不适用于您。

答案 1 :(得分:0)

知道了!您的所有反馈都是现场的。我永远不会得到这个。谢谢你,巴里!

这是我的工作指导书。首先,所有流量都重定向到HTTPS。然后,如果连接为HTTPS,则发送HSTS标头。正如您所暗示的,env=HTTPS并不是真正正确的方法。然后,重定向到WWW。

RewriteEngine On

# Redirect to HTTPS
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

<If "%{HTTPS} == 'on'">
 Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</If>

# Redirect to WWW
RewriteCond %{HTTPS} off [OR,NC]
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]