未在Wordpress页面上提供HSTS标头(通过.htaccess)

未在Wordpress页面上提供HSTS标头(通过.htaccess),.htaccess,hsts,.htaccess,Hsts,我的Wordpress网站通过.htaccess文件设置了HSTS头,它工作正常,直到某个时候它停止发送头,我不知道什么时候或为什么(我一直在配置和更新我的VPS服务器,所以一切都是可能的)。问题是,如果我直接将头添加到httpd.conf文件中,它仍然有效,只是当我试图通过.htaccess文件逐个站点地添加头时,它就不起作用了。重定向、密码和其他东西仍然可以使用.htaccess btw 此外,我创建的空白测试html页面仍然发送HSTS标题。那么,在为wordpress PHP页面提供服务

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

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

这是我使用的代码:

Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" env=HTTPS
我重复一遍,如果我编辑Apache配置文件,同样的代码也可以工作。。。当我提供空白html文件时,它仍然通过.htaccess工作。这一定有个简单的解释吧?谢谢

怀特先生请求的最新情况。以下是my.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
HTML:

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

但是,要使其与由WP前端控制器重写的WordPress“虚拟”URL协同工作,那么(在Apache上),您需要检查
重定向\u HTTPS
env var,因为
HTTPS
env var是在请求被内部重写到WP前端控制器之后重命名的

例如:

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

显然,WordPress创建的重定向忽略了.htaccess规则/头,而且由于www重定向是由WordPress完成的,因此没有发送正确的头。我可以发誓它在某个时候起作用了,但也许我后来添加了重定向,然后忘记了。感谢White先生指出,所有重定向最好由Apache完成。我将www重定向移到htaccess,现在一切又恢复正常了


我想接受White先生的评论“为什么不在.htaccess中也执行此重定向?–MrWhite Dec 2”作为答案,但显然这在评论中是不可能的,只有回复?如果您愿意,您可以将上述解决方案作为答案发布,因为这是您应得的荣誉。谢谢

您在哪里设置
HTTPS
环境变量?“如果我将头直接添加到httpd.conf文件中,它仍然有效”-这是使用您在上面发布的确切指令吗?虽然它不应该包括
env=
参数(因为我假设您只是在vHost中为端口443设置此参数)。是的,这使用的是完全相同的指令,包括env=https参数,因为我想我真的不太清楚。我使用的是WHM/CPanel CentOS 7 VPS,所以我不需要手动设置太多就可以让它工作。直到它停止,这是:/MrWhite,非常感谢您抽出时间!仅将我的代码更改为您的代码并不能解决问题。我的网站仍然没有在WP php页面上发送HSTS标题。这可能无关紧要,但是my.htaccess设置了一个https重定向,将所有http流量直接重定向到https,然后WP将其再次重定向到www(规范url),以满足两个重定向的HSTS预加载要求(不幸的是)。https重定向设置如下:RewriteCond%{SERVER\u PORT}^443$RewriteRule^(.*)$https://%{HTTP_HOST}%{REQUEST_URI}[L,R=301]请编辑您的问题,以包含
.htaccess
文件的内容。正在设置的
HTTPS
env变量在哪里?“然后WP再次将其重定向到www”-为什么不在
.htaccess
中执行此重定向?同时尝试删除
env=
参数。这应该在所有请求(包括HTTP)上无条件地设置它。这不应违反HSTS预载(尽管可能会触发警告,因为这是“不必要的”)。这当然不是违反法律。当兼容浏览器通过普通HTTP接收到这个标题时,他们应该忽略它。至于不在.htaccess中执行www重定向,Wordpress默认已经在做了,所以我没有为此烦恼。但我认为最好马上由Apache完成,我应该更改它,对吗?如果我发布的htaccess文件中没有红旗,我会尝试一下你的其他建议。更新:如果我删除了ENV-var,它会发送HSTS头,但只在第一次重定向(http到https)时发送,一旦到达https,头就不再出现在通往www的路上。如果我包含ENV-var,它就根本不会发送。因此,我想你可能是对的,没有正确设置环境变量是罪魁祸首,不幸的是,这超出了我的知识范围。我应该用谷歌搜索什么来解决这个问题/更好地理解它?谢谢
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
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" env=HTTPS
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" env=REDIRECT_HTTPS