【问题标题】:HSTS header (through .htaccess) not being served on Wordpress pagesHSTS 标头(通过 .htaccess)未在 Wordpress 页面上提供
【发布时间】:2020-12-02 15:14:43
【问题描述】:

我的 Wordpress 网站通过 .htaccess 文件设置了 HSTS 标头,它工作正常,直到某个时候它停止发送标头,我不知道何时或为什么(我一直在配置和更新我的VPS 服务器,所以一切皆有可能)。问题是,如果我将标头直接添加到 httpd.conf 文件,它仍然有效,只是当我尝试通过 .htaccess 文件逐个站点进行操作时,它仍然有效。使用 .htaccess 顺便说一句,重定向、密码和其他东西仍然有效...

此外,我创建的空白测试 html 页面仍然发送 HSTS 标头。那么,在提供 wordpress PHP 页面时,什么会覆盖 HSTS 规则呢?因为显然 httaccess 代码仍然是正确的,因为 html 页面按预期提供了它。

这是我使用的代码:

Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" env=HTTPS

我再说一遍,如果我编辑 Apache 配置文件,同样的代码可以工作......当我提供空白 html 文件时,它仍然可以通过 .htaccess 工作。必须有一个简单的解释?谢谢!

根据 MrWhite 的要求更新。这是我的 .htaccess 的内容:

RewriteEngine On

Header set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" env=HTTPS

RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

<files wp-config.php>
order allow,deny
deny from all
</files>

Options -Indexes

ErrorDocument 401 default
ErrorDocument 403 Denied

<FilesMatch “wp-login.php”=””>
AuthType Basic
AuthName "Private area. Failed attempt IPs logged and reported."
AuthUserFile "/home/censoredusername/.htpasswds/public_html/wp-admin/passwd"
Require valid-user
</FilesMatch>

<Files admin-ajax.php>
Order allow,deny
Allow from all
Satisfy any
</Files>

# BEGIN WordPress
# The directives (lines) between "BEGIN WordPress" and "END WordPress" are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

# Wordfence WAF
<Files ".user.ini">
<IfModule mod_authz_core.c>
    Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
    Order deny,allow
    Deny from all
</IfModule>
</Files>

# END Wordfence WAF

以下是 WordPress 之外的 html 和 php 附带的重定向和服务器响应(没有指定 htaccess 的 env var)。他们错过了 www 重定向,因为到目前为止该重定向是由 WordPress 完成的。从现在开始会将其包含在 htaccess 中。

PHP:

censored.com/test.php

HTTP/1.1 301 Moved Permanently
Date: Thu, 03 Dec 2020 13:39:33 GMT
Server: Apache
X-XSS-Protection: 1; mode=block;
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Location: https://censored.com/test.php
Content-Length: 243
Content-Type: text/html; charset=iso-8859-1

https://censored.com/test.php

HTTP/1.1 200 OK
Date: Thu, 03 Dec 2020 13:39:36 GMT
Server: Apache
X-XSS-Protection: 1; mode=block;
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Vary: User-Agent
Content-Length: 11
Content-Type: text/html; charset=UTF-8

HTML:

censored.com/test.html

HTTP/1.1 301 Moved Permanently
Date: Thu, 03 Dec 2020 13:42:39 GMT
Server: Apache
X-XSS-Protection: 1; mode=block;
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Location: https://censored.com/test.html
Content-Length: 244
Content-Type: text/html; charset=iso-8859-1

https://censored.com/test.html

HTTP/1.1 200 OK
Date: Thu, 03 Dec 2020 13:42:41 GMT
Server: Apache
X-XSS-Protection: 1; mode=block;
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Last-Modified: Wed, 02 Dec 2020 12:45:56 GMT
Accept-Ranges: bytes
Content-Length: 120
Vary: Accept-Encoding,User-Agent
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Content-Type: text/html

【问题讨论】:

  • 你在哪里设置HTTPS环境变量?
  • “如果我将标头直接添加到 httpd.conf 文件,它仍然有效” - 是使用您在上面发布的 exact 指令吗?虽然它不应该包含 env= 参数(因为我假设您只是在 vHost 中为端口 443 设置它)。
  • 是的,那是使用完全相同的指令,包括 env=https 参数,因为我猜我不太清楚。我在 WHM/CPanel CentOS 7 VPS 上,所以我不需要手动设置太多就可以让它工作。直到它停止是:/

标签: .htaccess hsts


【解决方案1】:
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" env=HTTPS

您没有说明在哪里设置 HTTPS environment 变量(这不是默认设置的;它与 HTTPS 的服务器变量不同同名)。

但是,要使用由 WP 前端控制器重写的 WordPress“虚拟”URL(在 Apache 上),您需要检查 REDIRECT_HTTPS env var,因为 HTTPS env var 是请求在内部重写到 WP 前端控制器后重命名。

例如:

Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" env=REDIRECT_HTTPS

【讨论】:

  • MrWhite,非常感谢您抽出宝贵时间!仅将我的代码更改为您的代码并不能解决问题。我的网站仍然没有在 WP php 页面上发送 HSTS 标头。可能没关系,但是我的 .htaccess 设置了 https 重定向,将所有 http 流量直接重定向到 https,然后 WP 将其再次重定向到 www(规范 url)以满足两个重定向的 HSTS 预加载要求(不幸的是) . https 重定向设置如下: RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • 请编辑您的问题以包含您的.htaccess 文件的内容。 HTTPS 环境变量在哪里设置? “然后 WP 再次将其重定向到 www” - 为什么不在 .htaccess 中执行此重定向?
  • 还可以尝试完全删除 env= 参数。这应该在所有请求(包括 HTTP)上无条件地设置它。这不应该违反 HSTS 预加载(尽管可能会触发警告 - 因为它是“不必要的”)。这当然不违反HSTS。当兼容的浏览器通过纯 HTTP 接收此标头时,它们应该简单地忽略它。
  • 我已经编辑了我的问题以包含 .htaccess。至于不在 .htaccess 中执行 www 重定向,默认情况下 Wordpress 已经在执行此操作,所以我没有理会它。但我认为最好由 Apache 立即完成,我应该更改它,对吗?如果我发布的 htaccess 文件中没有危险信号,我会尝试您的其他建议。
  • 更新:如果我删除 ENV var,它会发送 HSTS 标头,但仅在第一次重定向(http 到 https)时,一旦在 https,标头在前往 www 的途中不再存在。如果我包含 ENV var,则根本不会发送它。所以我想你可能是正确的 env var 没有正确设置是罪魁祸首,不幸的是这超出了我的知识范围。我应该谷歌什么来解决这个问题/更好地理解它?谢谢!
【解决方案2】:

显然 WordPress 创建的重定向忽略了 .htaccess 规则/标头,并且由于 www 重定向是由 WordPress 完成的,因此未发送正确的标头。我可以发誓它在某个时候有效,但也许我后来添加了重定向并忘记了。感谢 MrWhite 指出所有重定向最好由 Apache 完成。我将 www 重定向移至 htaccess,现在一切正常。

我想接受 MrWhite 的评论“为什么不在 .htaccess 中执行此重定向?- MrWhite Dec 2”作为答案,但显然这对于​​ cmets 是不可能的,只能回复?如果您愿意,您可以将上述解决方案作为答案发布,因为您值得称赞。谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多