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

nie*_*lsr 70 apache .htaccess mod-headers

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

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

Header always set Strict-Transport-Security "max-age=31536000"
Run Code Online (Sandbox Code Playgroud)

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

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

nie*_*lsr 101

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

Header set Strict-Transport-Security "max-age=31536000" env=HTTPS
Run Code Online (Sandbox Code Playgroud)

  • 对我来说也没有用; 然而在"工作"上追加"expr =%{HTTPS} ==".整行然后是`Header always set Strict-Transport-Security"max-age = 63072000; includeSubDomains; preload""expr =%{HTTPS} =='on'"`.也许是因为`always`keyword? (12认同)
  • @ ted.strauss它将在`.htaccess`文件中. (7认同)
  • 这个设置是什么文件? (2认同)
  • 请注意,条件“ env = HTTPS”中的“ HTTPS” _env var_与我们通常在mod_rewrite条件(和Apache expr)中以“%{HTTPS}”看到的_server var_不同。由于这是一个_env_变量,因此它取决于环境。服务器配置。有时它从未设置。有时,它被分配为与HTTPS服务器var相同的值(因此始终将其设置为“关闭”或“开启”-条件“ env = HTTPS”为_always_ true!“ env = HTTPS”只是测试是否设置了env var,而不是设置为“ on”。)建议在Apache 2.4+上使用@AdrianFöder建议的Apache expr (2认同)

LJT*_*LJT 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>
Run Code Online (Sandbox Code Playgroud)

  • 它更安全一点 - 如果您只打算在整个域中使用HTTPS.如果没有,那就太危险了 - 所以在没有警告的情况下建议它是不负责任的.假设您的网络服务器使用此标头响应顶级域(example.com)上的请求 - 然后当您包含子域时,由不同的Web服务器仅通过http而非https(例如intranet.example.com)提供服务的任何其他子域, 不管用.包括preload标签也允许将其提交到预加载列表,因此它被硬编码到Web浏览器中,然后是不可逆转的. (5认同)
  • 在添加"preload"参数之前,请阅读小字. (2认同)

Yud*_*ira 10

您可以使用它并将其放在您的 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
Run Code Online (Sandbox Code Playgroud)

首先,它会将非 https 重定向到 https。并使用 HSTS 标头将非 www https 重定向到 www https。

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

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