警告:HTTP上不必要的HSTS标头

Md *_*lah 7 .htaccess google-webmaster-tools hsts google-search-console

我想使用https://和非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>
Run Code Online (Sandbox Code Playgroud)

警告信息如下:

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

请帮我摆脱上述警告.我尝试使用以下代码,但它不起作用#ref.话题

 Header always set Strict-Transport-Security "max-age=31536000; 
 includeSubDomains; preload" env=HTTPS
Run Code Online (Sandbox Code Playgroud)

Bar*_*ard 5

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

Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
Run Code Online (Sandbox Code Playgroud)

代替这个:

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
Run Code Online (Sandbox Code Playgroud)

另一个选择是仅在HTTPS VirtualHost的而不是主要的顶级配置中进行设置:

做这个:

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

代替这个:

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

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

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

举一个例子,预加载会给您带来问题:假设您运行https://www.example.com,并且它还会响应http://example.com并将您重定向到https://example.com,然后重定向到https ://www.example.com(根据预加载提交的要求以及您的配置进行设置)。那么您的网站就很安全。但是,对于在内部重用其域的公司(这是很常见的),这可能会引起问题-特别是在您预加载时。例如,如果您运行的非安全站点不在http://intranet.example.com上公开提供,或者运行的站点的非安全开发版本在http://dev.example.com上,那么您可能没有意识到该站点现在也必须通过HTTPS提供服务(因为它是example.com的子域)。这很少会生效(因为大多数人不会访问http://example.comhttps://example.com,所以永远不会在顶级域上看到此HSTS标头),因此您可能在所有测试期间都不会注意到这一潜在问题。但是,一旦预加载生效,您的浏览器将立即知道顶级域的HSTS,即使不访问该域,您也将立即失去对那些仅HTTP站点的访问权限,并且无法轻松地将其撤消!许多公司仍然有很多内部站点和工具仅通过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>
Run Code Online (Sandbox Code Playgroud)

这不是那么安全(因为有人可以通过HTTP设置其他子域,例如http://wwww.example.com(注意四个W)或http://fake.subdomain.com),但至少它没有这样做。破坏仅HTT​​P网站。不允许通过预加载列表进行此设置,因为即使在顶级域上,它也需要更安全的includeSubDomains。

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

<img source="https://example.com/logo.png">
Run Code Online (Sandbox Code Playgroud)

以此运行,并且到期时间短,并且没有预加载标签。然后增加到期时间。然后,如果一切正常,请重新添加preload标签并提交到preload列表。

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