我搜索了几个小时,但似乎Apache没有满足我需求的解决方案。我需要检查请求头是否存在,并根据它定义重写规则。我可以检查头值是否为空,但如果头不存在,则这种情况不会考虑头的存在。我已经尝试了if else指令,但也没有成功,因为Apache似乎只关注价值。
如果标头值为空,则此操作有效,但如果这些标头不存在,则无效。
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
2条答案
按热度按时间vbopmzt11#
正如上面的注解中所提到的,您显示的代码应该 * 按原样 * 工作,以设置两种情况下的请求头
x-test
,即1.所有提到的四个标题都是空的
1.所有提到的四个标题都丢失了(您希望这个标题工作)
我建议使用
mod_setenvif
的更简洁的代码请注意,我们如何在单个正则表达式中合并所有四个头,而不是在所示的
mod_rewrite
规则中组合4个不同的RewriteCond
指令。为了进行测试,我在本地运行的Apache上使用了以下
curl
命令:我们将得到
x-test: 1
,它只显示第一个命令的响应。lbsnaicq2#
您是正确的,您无法区分存在但为空的HTTP请求头和根本不存在的HTTP请求头-您必须假设在这两种情况下它都不存在,这在大多数(所有?)情况下都是正确的操作。(我不知道有任何请求头将 * 空 * 值视为 * 正 * 值?)
例如:
如果
Sec-Fetch-Dest
HTTP请求标头存在但为空或根本不存在于HTTP请求中,则上述 * 条件 * 将成功。如果标头值为空,则此操作有效,但如果这些标头不存在,则无效。
我不知道为什么你说如果头文件“不存在”就不能用,不管所有的头文件都不存在或者都是空的,都应该同样处理,这是可以论证的正确操作。
这些头文件都不允许 empty 值,因此在这种情况下,假设它们为空时不存在肯定是正确的操作。
进一步阅读: