我的网站托管在AWS上,我使用SEMRush来跟踪任何服务器和编程问题。
我的SEMRush在运行时发现了这个错误。
2个子域不支持HSTS。
因此我把下面的代码来解决这个问题
<IfModule mod_headers.c>
<If "%{REQUEST_SCHEME} == 'https' || %{HTTP:X-Forwarded-Proto} == 'https'">
Header set Strict-Transport-Security "max-age=31536000"
</If>
</IfModule>
现在解决了1个错误,但仍有一个子域具有相同的错误。
正如你所看到的,rosterelf.com
仍然不支持HSTS。
此外,我在htaccess中将非www重定向到www,这就是我的.htaccess
文件的样子。
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
<IfModule mod_headers.c>
<If "%{REQUEST_SCHEME} == 'https' || %{HTTP:X-Forwarded-Proto} == 'https'">
Header set Strict-Transport-Security "max-age=31536000"
</If>
</IfModule>
RewriteEngine On
##
## You may need to uncomment the following line for some hosting environments,
## if you have installed to a subdirectory, enter the name here also.
##
# RewriteBase /
##
## Uncomment following lines to force HTTPS.
##
# RewriteCond %{HTTPS} off
# RewriteRule (.*) https://%{SERVER_NAME}/$1 [L,R=301]
# CONDITIONS FOR ONLY LIVE SITE STARTS
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]
# CONDITIONS FOR ONLY LIVE SITE ENDS
##
## Allow robots.txt
##
RewriteRule ^robots.txt - [L]
## 301 redirect for old support details page url to new one
## OLD URL https://www.rosterelf.com/support-detail/1903/how-can-employees-clock-inout-of-time-clock-different-slug
## NEW URL https://www.rosterelf.com/support-detail/how-can-employees-clock-inout-of-time-clock-different-slug
RewriteRule ^(support-detail)/\d+/([\w-]+)/?$ /$1/$2 [R=301,NC,L]
RewriteRule ^blog-detail/\d+/([\w-]+)/?$ /blog/$1 [R=301,NC,L]
##
## Black listed folders
##
RewriteRule ^bootstrap/.* index.php [L,NC]
RewriteRule ^config/.* index.php [L,NC]
RewriteRule ^vendor/.* index.php [L,NC]
RewriteRule ^storage/cms/.* index.php [L,NC]
RewriteRule ^storage/logs/.* index.php [L,NC]
RewriteRule ^storage/framework/.* index.php [L,NC]
RewriteRule ^storage/temp/protected/.* index.php [L,NC]
RewriteRule ^storage/app/uploads/protected/.* index.php [L,NC]
##
## White listed folders
##
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} !/.well-known/*
RewriteCond %{REQUEST_FILENAME} !/storage/app/uploads/public/.*
RewriteCond %{REQUEST_FILENAME} !/storage/app/media/.*
RewriteCond %{REQUEST_FILENAME} !/storage/app/resized/.*
RewriteCond %{REQUEST_FILENAME} !/storage/temp/public/.*
RewriteCond %{REQUEST_FILENAME} !/themes/.*/(assets|resources)/.*
RewriteCond %{REQUEST_FILENAME} !/plugins/.*/(assets|resources)/.*
RewriteCond %{REQUEST_FILENAME} !/modules/.*/(assets|resources)/.*
RewriteRule !^index.php index.php [L,NC]
##
## Block all PHP files, except index
##
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} \.php$
RewriteRule !^index.php index.php [L,NC]
##
## Standard routes
##
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
我需要把下面的代码
<IfModule mod_headers.c>
<If "%{REQUEST_SCHEME} == 'https' || %{HTTP:X-Forwarded-Proto} == 'https'">
Header set Strict-Transport-Security "max-age=31536000"
</If>
</IfModule>
在<IfModule mod_rewrite.c>
条件之外?我应该怎么做来解决这个问题?
有人能给我指路吗。
谢谢
2条答案
按热度按时间hs1rzwqc1#
如果你想在重定向中添加一个header,你肯定需要
always
,所以试试这个:xmakbtuz2#
我的SEMRush在运行时发现了这个错误。
澄清一下,严格来说,这不是一个“错误”,除非你明确地试图实现HSTS。(看起来你不像是?)HSTS是一个 * 建议 *。
但是仍然具有一个或多个具有相同误差的子域。
SEMRush的标识很奇怪;这不是一个子域,这是“域顶点”(即没有子域)。
在实现HSTS时,你需要首先在“相同的主机名”上从HTTP重定向到HTTPS,* 在 * 你规范化主机名之前,即在你从no-www(域顶点)重定向到www之前。
这意味着你不能做你在这里做的事情.在一个重定向中从HTTP和no-www重定向到HTTPS和www。(当前注解掉的HTTP到HTTPS重定向是你需要使用的。)
但是,您当前的规则也是不完整的,因为它在请求HTTPS时无法规范化主机名。也就是说,它不会不将
https://example.com/
重定向到https://www.example.com/
。检查HTTPS
是off
的第一个条件确保该规则仅针对HTTP请求进行处理。在实现HSTS时,您的重定向需要这样写:
第二个重定向到规范化主机名,并假设你没有其他子域,应该是可访问的,因为它重定向任何“不是www”。
是的,这确实(不幸的是)意味着用户在第一次请求
http://example.com/
时会经历两次重定向。但这是HSTS的本质。而且这只是用户第一次访问非规范主机名上的HTTP。这将在HTTPS“success”响应上设置STS头。但是,HSTS也要求您在从no-www到www的HTTPS规范重定向上设置此头。目前,上述指令仅在
onsuccess
(200 Ok)响应上设置头要在301重定向上设置头部,你需要always
条件,正如@BarryPollard在他的回答中已经指出的那样:只需要补充一下,
always
条件不仅会在3xx响应上设置头部,而且还会在其他4xx响应上设置头部。<If>
表达式本身也有点可疑。您应该只检查X-Forwarded-Proto
头 * 如果 * 您的应用服务器位于管理安全连接的前端代理之后。然而,如果你是在一个代理之后,那么你不需要检查REQUEST_SCHEME
服务器变量。(看起来这个表达式是一个通用的“包罗万象”。)上述表达式的问题是,如果您不在代理后面,则恶意请求可能会注入X-Forwarded-Proto
HTTP请求标头并欺骗您的服务器,发送header。从你的HTTP到HTTPS的重定向(检查
HTTPS
服务器变量)看起来你好像 * 不是 * 在前端代理后面。虽然,也许你是,我们需要修改上面的HTTP到HTTPS重定向?因此,如果您不在前端代理的后面,那么下面的
<If>
表达式更可取:或者
如果使用Apache 2.2(或Apache 2.4),您可以执行以下操作,而不是使用
<If>
表达式:在这个例子中,将指令放在
<IfModule>
容器内部或外部没有区别(因为可能安装了mod_rewrite和mod_headers)。实际上,严格来说,<IfModule>
Package 器可能应该完全删除。有关此问题的更多信息,请参阅网站管理员堆栈上的以下问题my answer: