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

时间:2017-07-10 22:58:26

标签: .htaccess google-webmaster-tools hsts google-search-console

我想始终使用 https ://和非www。网址。所以我在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标头 http://mysiteurl.com处的HTTP页面发送HSTS标头。这对HTTP没有影响,应该删除。

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

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

4 个答案:

答案 0 :(得分:4)

尝试删除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虚拟主机。

请拜托,请注意预加载。它不容易逆转!我强烈建议您在提交预装清单之前,使用良好(即无错误)配置运行几个月 - 这似乎是您没有做过的。

举一个例子,其中preload可能会导致您出现问题:假设您运行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>

这不太安全(因为有人可以通过HTTP设置其他子域,如http://wwww.example.com(注意四个W)或http://fake.subdomain.com),但至少它不会破坏那些仅限HTTP的站点。这种设置不允许通过预加载列表,因为即使在顶级域上它也需要更安全的includeSubDomains。

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

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

运行,并且有一个小的到期时间,并且没有预加载标记。然后增加到期日。然后,如果一切正常,请重新添加preload标记并提交到预加载列表。

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

答案 1 :(得分:1)

问题是当您使用<%= link_to 'Change My Password', edit_user_password_url(@user.id, token: @user.confirmation_token.html_safe) %>

连接用户时,您正在发送标头

如果您想强制他们使用HTTP,请首先执行重定向。

HTTPS

答案 2 :(得分:0)

Ubuntu 18.04 apache2 Letsencrytp

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

标头始终将严格传输安全性设置为“ max-age = 63072000; includeSubDomains;预加载” env = HTTPS

service apache2 restart

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

答案 3 :(得分:0)

我通过这种方法解决了基于 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>