apache .htaccess:如何检查请求头是否存在.htaccess?

au9on6nz  于 2022-11-16  发布在  Apache
关注(0)|答案(2)|浏览(292)

我搜索了几个小时,但似乎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
vbopmzt1

vbopmzt11#

正如上面的注解中所提到的,您显示的代码应该 * 按原样 * 工作,以设置两种情况下的请求头x-test,即
1.所有提到的四个标题都是空的
1.所有提到的四个标题都丢失了(您希望这个标题工作)
我建议使用mod_setenvif的更简洁的代码

SetEnvIf ^Sec-Fetch-(Dest|Mode|Site|User)$ ^$ aTEST
Header set x-test "1" env=aTEST

请注意,我们如何在单个正则表达式中合并所有四个头,而不是在所示的mod_rewrite规则中组合4个不同的RewriteCond指令。
为了进行测试,我在本地运行的Apache上使用了以下curl命令:

curl -IL -H 'localhost/'
curl -IL -H 'Sec-Fetch-Dest: foo' 'localhost/'
curl -IL -H 'Sec-Fetch-Mode: bar' 'localhost/'

我们将得到x-test: 1,它只显示第一个命令的响应。

lbsnaicq

lbsnaicq2#

您是正确的,您无法区分存在但为空的HTTP请求头和根本不存在的HTTP请求头-您必须假设在这两种情况下它都不存在,这在大多数(所有?)情况下都是正确的操作。(我不知道有任何请求头将 * 空 * 值视为 * 正 * 值?)
例如:

RewriteCond %{HTTP:Sec-Fetch-Dest} ^$ [NC]

如果Sec-Fetch-Dest HTTP请求标头存在但为空或根本不存在于HTTP请求中,则上述 * 条件 * 将成功。
如果标头值为空,则此操作有效,但如果这些标头不存在,则无效。

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

我不知道为什么你说如果头文件“不存在”就不能用,不管所有的头文件都不存在或者都是空的,都应该同样处理,这是可以论证的正确操作。
这些头文件都不允许 empty 值,因此在这种情况下,假设它们为空时不存在肯定是正确的操作。
进一步阅读:

相关问题