我搜索了几个小时,但是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发布于 2022-09-07 11:08:22
您是正确的,您不能区分存在但为空或根本不存在的HTTP请求头--您必须假设在这两种情况下都不存在它,这将是大多数情况下正确的操作(全部?)关于案子的。(我不知道任何请求头,其中一个空值被认为是一个正值?)
例如:
RewriteCond %{HTTP:Sec-Fetch-Dest} ^$ [NC]如果HTTP请求头存在但为空或在Sec-Fetch-Dest请求中根本不存在,上述条件将是成功的。
如果标头值为空,则
此操作,但如果这些标头不存在,则无效。
RewriteCond %{HTTP:Sec-Fetch} ^$ NC RewriteCond %{HTTP:Sec-提取模式} ^$ NC RewriteCond %{HTTP- RewriteCond } ^$ NC RewriteCond%{HTTP-Fetch} ^$ NC RewriteRule ^.*$ - ENV=TEST:true报头集x-测试"1“env=TEST
我不知道为什么您说,如果标题“不存在”,这是行不通的。无论所有标头不存在还是都是空的,这都应该被处理,这可以说是正确的操作。
这些标头都不允许空值,因此假设它们在为空时不存在,在这种情况下肯定是正确的操作。
进一步读:
发布于 2022-09-07 14:20:55
正如在上面的注释中所提到的,您的代码应该像设置请求头x-test一样工作,这两种情况都是这样的。
我建议使用mod_setenvif编写更简洁的代码
SetEnvIf ^Sec-Fetch-(Dest|Mode|Site|User)$ ^$ aTEST
Header set x-test "1" env=aTEST请注意,我们如何在单个正则表达式中组合所有四个标头,而不是在所示的RewriteCond规则中组合4个不同的mod_rewrite指令。
为了进行测试,我在本地运行的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。
https://stackoverflow.com/questions/73633901
复制相似问题