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

我的Web应用程序运行在我控制的不同数量的主机上。 为了防止需要更改每个虚拟主机的Apacheconfiguration,我使用.htaccess文件在我的回购中添加了大部分configuration,所以每个主机的基本设置只是几行。 这也可以在部署新版本时更改configuration。 目前.htaccess(联合国)设置标题,做一些重写魔术,并控制UA的caching。

我想在使用.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 。

我试图使用环境variables设置标题,但我卡在那里。 任何人知道如何做到这一点?

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

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

为了构buildnielsr的答案,我在.htaccess中使用了以下内容来满足https://hstspreload.appspot.com上的安全部署build议,该build议将把域硬编码到Chrome浏览器中。; 请注意,这将在您的子域中执行HSTS,并且包含在预加载列表中不能轻易撤消,所以rtfm。

 <IfModule mod_headers.c> Header set Strict-Transport-Security "max-age=10886400; includeSubDomains; preload" env=HTTPS </IfModule> 

对于httpd.conf (如果你有权编辑这个),你可以使用

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

注意:您只需将其设置在HTTPS虚拟主机上,并且不能位于http虚拟主机上。

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

允许.htaccess文件将使Apache在每次访问服务器时查找它们。 由于父目录也被search到,所以这需要一些(less量的)时间,并且会影响你的服务器的性能。 资源