.htaccess技术问题:如何检测HTTP请求头是否存在?
Apache检测请求头不存在的重写规则方案
要检测请求头不存在(而非仅值为空),可以通过以下两种方式实现:
方法一:使用RewriteCond匹配空变量
利用RewriteCond判断请求头对应的环境变量是否为空,兼容大部分Apache版本:
# 检测四个Sec-Fetch系列请求头均不存在或值为空 RewriteCond %{HTTP:Sec-Fetch-Dest} !^.+$ [NC] RewriteCond %{HTTP:Sec-Fetch-Mode} !^.+$ [NC] RewriteCond %{HTTP:Sec-Fetch-Site} !^.+$ [NC] RewriteCond %{HTTP:Sec-Fetch-User} !^.+$ [NC] RewriteRule ^.*$ - [ENV=TEST:true] Header set x-test "1" env=TEST
方法二:使用指令(Apache 2.4+)
若你的Apache版本是2.4及以上,<If>指令可更直观地检测请求头是否存在,无需依赖重写规则:
<If "!req('Sec-Fetch-Dest') && !req('Sec-Fetch-Mode') && !req('Sec-Fetch-Site') && !req('Sec-Fetch-User')"> Header set x-test "1" </If>
核心说明
- 方法一中的
!^.+$匹配“无任何字符”的情况,既覆盖请求头不存在(对应变量未定义,视为空),也包含头存在但值为空的场景。 - 方法二中的
req('HeaderName')会返回请求头的值,若头不存在则返回空,通过!req(...)即可判断头不存在。
内容的提问来源于stack exchange,提问作者Serpentdriver
相关产品推荐
相关产品推荐

