警告:不必要的 HSTS header 通过 HTTP

Warning: Unnecessary HSTS header over HTTP

我想始终使用 https:// 和 non www. URL。所以我在我的 htaccess 文件中使用了以下代码。但是我收到来自 https://hstspreload.org

的警告
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]    

<ifModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000;
includeSubDomains; preload" 
</ifModule>

警告消息如下:

警告: HTTP 上不必要的 HSTS header
http://mysiteurl.com 处的 HTTP 页面发送 HSTS header。这对 HTTP 没有影响,应该删除。

请帮助我消除上述警告。我也尝试了以下代码,但它不起作用 #ref. topic

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

问题是当用户使用 HTTP

连接时您正在发送 header

如果你想强制他们使用HTTPS,首先像这样执行重定向。

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

尝试删除 always 属性。所以这样做:

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

而不是这个:

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

另一个选项是只在 HTTPS VirtualHost 中而不是在主要的顶级配置中设置它:

这样做:

<VirtualHost *:443>
    (All other virtual host config)
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</VirtualHost>

而不是这个:

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
<VirtualHost *:443>
    (All other virtual host config)
</VirtualHost>

这有一个缺点(或优点取决于你如何看待它!)必须添加到每个 VirtualHost 才能生效,而第一个选项将自动应用于所有 HTTPS 虚拟主机。

并且拜托,拜托,请非常小心预加载。它不容易逆转!我强烈建议您 运行 在提交到预加载列表之前使用良好的(即 error-free)配置几个月 - 看起来您没有做过 -

举一个预加载会导致问题的例子:假设你 运行 https://www.example.com, and this also responds to http://example.com and redirects you to https://example.com and then https://www.example.com (as the preload submissions require and as your config is set up to do). Then your website is lovely and secure. However, for companies that reuse their domain internally (which is quite common) this can cause problems - especially when you preload. For example, if you run a non-secure site which is not publicly available at http://intranet.example.com, or perhaps a non-secure development version of your site at http://dev.example.com, then you may not realise that this site must now also be served over HTTPS (as it is a subdomain of example.com). This rarely takes effect (as most people don't visit http://example.com or https://example.com 所以永远不会在顶级域上看到这个 HSTS header)所以你可能永远不会注意到这个潜力在你所有的测试中出现问题。然而,一旦预加载生效,您的浏览器就会知道顶级域的 HSTS,即使您没有访问它,您也会立即失去对那些 HTTP-only 站点的访问权限,并且无法轻易逆转!许多公司仍然有许多仅通过 HTTP 提供服务的内部站点和工具,并且在短时间内将它们全部升级到 HTTPS(无论如何应该完成!)并不容易。

要解决此问题,请在内部使用不同的域,或者您只能在顶级域上不使用 includeSubDomain 进行设置:

<VirtualHost *:443>
    ServerName example.com
    (All other virtual host config)
    #Set HSTS at top level without includeSubDomain
    Header always set Strict-Transport-Security "max-age=31536000"
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    (All other virtual host config)
    #Set HSTS at subdomain level
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</VirtualHost>

这不是很安全(因为有人可以像 http://wwww.example.com (note the four Ws) or http://fake.subdomain.com 一样通过 HTTP 设置其他子域)但至少它不会破坏那些 HTTP-only 站点。此设置将不允许通过预加载列表,因为它需要更安全的 includeSubDomains,即使在顶级域上也是如此。

如果您确实想在顶级域上使用 includeSubDomains,那么我强烈建议您在 HTML 中包含来自顶级域的资源(即使它重定向到 www 版本,因为 HSTS 仍然是设置为 301s/302s)。通过这种方式,您可以确保访问者甚至在您预加载之前就在顶层加载 HSTS 配置。例如,您可以将徽标替换为对顶级域的调用:

<img source="https://example.com/logo.png">

运行 有了那个,还有一个小的到期时间,并且没有预加载标签。然后增加到期时间。然后,如果一切正常,添加回预加载标签并提交到预加载列表。

这听起来可能有点痛苦,也许您已经想到了所有这些,但是如果不仔细考虑预加载可能会非常危险,因为它不容易逆转。在我看来,预加载 HSTS 对大多数网站来说都是矫枉过正,尽管我同意这是最安全的选择。

Ubuntu 18.04 apache2 Letsencrytp

nano /etc/apache2/conf-enabled/ssl-params.conf

Header 始终设置 Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" env=HTTPS

service apache2 restart

删除或评论 apache.conf 上的所有其他虚拟主机配置 #Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" env=HTTPS

我用这种方法解决了基于 litespeed 的服务器中的错误。也适用于 Apache。首先将此代码添加到您的 htaccess-

# Force HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

然后添加这段代码-

<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" env=HTTPS
</IfModule>