【问题标题】:301 Redirects to WWW with HSTS Preload Header301 重定向到带有 HSTS 预加载标头的 WWW
【发布时间】:2019-03-15 20:37:40
【问题描述】:

我打算 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 标头。但是,预加载的条件是根域必须发送header。

我做了功课并进行了搜索。我几年前读过this post,但我的问题不是关于SEO。而且,两种重定向(一种从 HTTP 到 HTTPS,一种从 to)对 Google 来说是可以的。

我有理由相信我可以进行 HSTS 预加载和 WWW 重定向。 Troyhunt.com 重定向到 HTTPS,然后是 WWW。根域也在hstspreload.org 上进行验证。但是,我相信他使用的是 IIS,所以问他在 Apache 上做什么对我帮助不大。

如有任何想法,我将不胜感激。我正在尝试,但我有点初学者。谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    这是我的工作说明。首先,所有流量都被重定向到 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]
    

    【讨论】:

    • 这是正确的,如hstspreload.org 上的注释在 home.pl 上删除 包装,如果没有可见的标题,则相同。确保在任何其他重定向之前。如果添加了第二个,则将其用作唯一一个。
    【解决方案2】:

    要在重定向中包含标头,您需要添加 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,因此这可能不适用于您。

    【讨论】:

    • 谢谢,巴里!不幸的是,它产生了相同的结果。也就是说,我想我更接近了。由于您告知我always 属性,我做了一些阅读。作为解决方案的一部分,这肯定是必需的。
    • 您确定要在重定向之前而不是之后设置标题吗?我用另一种(恕我直言)设置它的方式更新了我的答案。
    • 我将标题作为我的 htaccess 文件中的第一条指令,在 RewriteEngine On 用于重定向之前。就您而言,标头似乎是在重定向后设置的。我正在使用托管主机并且无权访问 SSL 虚拟主机。我会问的。再次感谢巴里!
    猜你喜欢
    • 2018-05-01
    • 2019-08-26
    • 2016-10-12
    • 2015-02-24
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    相关资源
    最近更新 更多