88

我的 Web 应用程序在我控制的不同数量的主机上运行。为了防止需要更改每个虚拟主机的 Apache 配置,我在我的存储库中使用 .htaccess 文件添加了大部分配置,因此每个主机的基本设置只有几行。这也使得在部署新版本时更改配置成为可能。目前 .htaccess (un) 设置标头,执行一些重写魔术并控制 UA 的缓存。

我想使用 .htaccess 在应用程序中启用 HSTS。只需设置标题很容易:

Header always set Strict-Transport-Security "max-age=31536000"

但规范明确指出:“HSTS 主机不得在通过非安全传输传输的 HTTP 响应中包含 STS 标头字段。”。因此,我不想在通过 HTTP 连接发送标头时发送标头。看https://datatracker.ietf.org/doc/html/draft-ietf-websec-strict-transport-sec-14

我尝试使用环境变量设置标题,但我被困在那里。有谁知道该怎么做?

4

5 回答 5

124

显然有一个可以轻松使用的 HTTPS 环境变量。对于有相同问题的人:

Header set Strict-Transport-Security "max-age=31536000" env=HTTPS
于 2014-06-10T15:31:31.533 回答
32

为了建立 nielsr 的答案,我在 .htaccess 中使用了以下内容来满足https://hstspreload.org上的安全部署建议,这会将域硬编码到 Chrome 浏览器中。请注意,这将在您的子域中强制执行 HSTS,并且包含在预加载列表中的内容无法轻易撤消,因此 rtfm.

<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
</IfModule>
于 2016-09-13T02:54:50.290 回答
11

您可以使用它并将其放在您的 htaccess 文件中以符合https://hstspreload.org。把它放在你的 .htaccess 文件中。

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L,E=HTTPS:1]
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS

首先,它会将非 https 重定向到 https。并将非 www https 重定向到带有 HSTS 标头的 www https。

http://example.com -> https://example.com -> https://www.example.com - 带有 HSTS 标头)

经过测试并符合https://hstspreload.org

于 2019-05-09T16:39:01.180 回答
4

对于httpd.conf(如果您有权编辑此内容),您可以使用

<VirtualHost 65.81.122.43:443>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains;"
</VirtualHost>

注意:您只需要在 HTTPS vhost 上设置它,不能在 http vhost 上。

我应该什么时候使用,不应该使用 .htaccess 文件?

允许 .htaccess 文件将使 Apache 在每次访问您的服务器时查找它们。由于还会搜索父目录,因此这将花费一些(少量)时间,并且可能会影响服务器的性能。 资源

于 2017-03-17T09:50:52.460 回答
1

另一种选择是始终设置标头并有条件地将其删除以用于非 ssl 连接:

Header always set   Strict-Transport-Security "max-age=31536000" early
Header        unset Strict-Transport-Security env=!HTTPS

这样做的好处是,该Header指令既可以与env条件一起使用,也可以与early标志一起使用。使用单个Header指令,env不能early一起使用,它们是互斥的(参见官方文档:https ://httpd.apache.org/docs/current/mod/mod_headers.html#header )。

于 2019-01-15T13:53:56.883 回答