尝试删除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 虚拟主机。
请,请,请非常小心预加载。不容易逆转!我强烈建议您在提交到预加载列表之前使用良好(即无错误)配置运行几个月 - 看起来您没有这样做。
举一个预加载可能给您带来问题的例子:假设您运行https://www.example.com,这也响应http://example.com并将您重定向到https://example.com,然后是https://www.example.com(根据预加载提交的要求和您的config 设置为做)。那么您的网站既可爱又安全。但是,对于在内部重用其域的公司(这很常见),这可能会导致问题 - 尤其是在您预加载时。例如,如果您在http://intranet.example.com 上运行一个不公开的非安全站点,或者在http://dev.example.com 上运行您的站点的非安全开发版本,那么您可能没有意识到这个站点现在也必须提供服务通过 HTTPS(因为它是 example.com 的子域)。这很少生效(因为大多数人不访问http://example.com 或https://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 对大多数网站来说都是多余的,尽管我同意这是最安全的选择。