我的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。
我尝试使用环境变量设置标题,但我被困在那里。谁知道怎么做?
答案 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
指令,env
和early
不能一起使用,它们是互斥的(请参阅官方文档: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