10

我想使用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。话题

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

4 回答 4

8

尝试删除该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 *: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">

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

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

于 2017-07-11T02:52:21.103 回答
0

我通过这种方法解决了基于 litespeed 的服务器中的错误。也适用于阿帕奇。首先将此代码添加到您的 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>
于 2021-07-05T16:56:06.457 回答
0

Ubuntu 18.04 apache2 Letsencrytp

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

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

service apache2 restart

删除或评论 # 所有其他 vhost conf on apache.confwith #Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" env=HTTPS

于 2019-12-03T02:37:08.673 回答
-1

问题是当用户使用连接时您正在发送标头HTTP

如果您想强制他们使用HTTPS,请先执行重定向,如下所示。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
于 2017-07-10T23:08:07.077 回答