如何仅在HTTPS上从.htaccess设置HSTS标头

时间:2014-06-10 15:10:22

标签: apache .htaccess mod-headers

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

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

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

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

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

5 个答案:

答案 0 :(得分:99)

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

Header set Strict-Transport-Security "max-age=31536000" env=HTTPS

答案 1 :(得分:22)

为了建立在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>

答案 2 :(得分:3)

对于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在每次访问您的服务器时都会查找它们。由于也会​​搜索父目录,因此这将花费一些(少量)时间,并且可能会影响服务器的性能。   Source

答案 3 :(得分:0)

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

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

这具有一个优势,即Header指令可以与env条件以及early标志一起使用。通过单个Header指令,envearly不能一起使用,它们是互斥的(请参阅官方文档:https://httpd.apache.org/docs/current/mod/mod_headers.html#header)。

答案 4 :(得分:0)

您可以使用它并将其放在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。并使用HSTS标头将非www https重定向到www https。

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

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