.htaccess 1个子域不支持HSTS

pbpqsu0x  于 2023-10-23  发布在  其他
关注(0)|答案(2)|浏览(146)

我的网站托管在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>条件之外?我应该怎么做来解决这个问题?
有人能给我指路吗。
谢谢

hs1rzwqc

hs1rzwqc1#

如果你想在重定向中添加一个header,你肯定需要always,所以试试这个:

Header always set Strict-Transport-Security "max-age=31536000"
xmakbtuz

xmakbtuz2#

我的SEMRush在运行时发现了这个错误。
澄清一下,严格来说,这不是一个“错误”,除非你明确地试图实现HSTS。(看起来你不像是?)HSTS是一个 * 建议 *。
但是仍然具有一个或多个具有相同误差的子域。
SEMRush的标识很奇怪;这不是一个子域,这是“域顶点”(即没有子域)。

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]

在实现HSTS时,你需要首先在“相同的主机名”上从HTTP重定向到HTTPS,* 在 * 你规范化主机名之前,即在你从no-www(域顶点)重定向到www之前。
这意味着你不能做你在这里做的事情.在一个重定向中从HTTP和no-www重定向到HTTPS和www。(当前注解掉的HTTP到HTTPS重定向是你需要使用的。)
但是,您当前的规则也是不完整的,因为它在请求HTTPS时无法规范化主机名。也就是说,它不会https://example.com/重定向到https://www.example.com/。检查HTTPSoff的第一个条件确保该规则仅针对HTTP请求进行处理。
在实现HSTS时,您的重定向需要这样写:

# 1. Redirect HTTP to HTTPS on the same host
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# 2. Redirect non-www to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

第二个重定向到规范化主机名,并假设你没有其他子域,应该是可访问的,因为它重定向任何“不是www”。
是的,这确实(不幸的是)意味着用户在第一次请求http://example.com/时会经历两次重定向。但这是HSTS的本质。而且这只是用户第一次访问非规范主机名上的HTTP。

<If "%{REQUEST_SCHEME} == 'https' || %{HTTP:X-Forwarded-Proto} == 'https'">
    Header set Strict-Transport-Security "max-age=31536000"
</If>

这将在HTTPS“success”响应上设置STS头。但是,HSTS也要求您在从no-www到www的HTTPS规范重定向上设置此头。目前,上述指令仅在onsuccess(200 Ok)响应上设置头要在301重定向上设置头部,你需要always条件,正如@BarryPollard在他的回答中已经指出的那样:

# Set the STS header on redirects as well as 200 OK responses.
Header always set Strict-Transport-Security "max-age=31536000"

只需要补充一下,always条件不仅会在3xx响应上设置头部,而且还会在其他4xx响应上设置头部。
<If>表达式本身也有点可疑。您应该只检查X-Forwarded-Proto头 * 如果 * 您的应用服务器位于管理安全连接的前端代理之后。然而,如果你是在一个代理之后,那么你不需要检查REQUEST_SCHEME服务器变量。(看起来这个表达式是一个通用的“包罗万象”。)上述表达式的问题是,如果您不在代理后面,则恶意请求可能会注入X-Forwarded-Proto HTTP请求标头并欺骗您的服务器,发送header。
从你的HTTP到HTTPS的重定向(检查HTTPS服务器变量)看起来你好像 * 不是 * 在前端代理后面。虽然,也许你是,我们需要修改上面的HTTP到HTTPS重定向?
因此,如果您不在前端代理的后面,那么下面的<If>表达式更可取:

<If "%{REQUEST_SCHEME} == 'https'>

或者

<If "%{HTTPS} == 'on'>

如果使用Apache 2.2(或Apache 2.4),您可以执行以下操作,而不是使用<If>表达式:

# Set HSTS env var only if HTTPS
RewriteCond %{HTTPS} on
RewriteRule ^ - [E=HSTS:1]

# Set STS header only when the HSTS env var is set (including redirects)
Header always set Strict-Transport-Security "max-age=31536000" env=HSTS
Out side of `<IfModule mod_rewrite.c>` condition ?

在这个例子中,将指令放在<IfModule>容器内部或外部没有区别(因为可能安装了mod_rewrite和mod_headers)。实际上,严格来说,<IfModule> Package 器可能应该完全删除。
有关此问题的更多信息,请参阅网站管理员堆栈上的以下问题my answer

相关问题