为什么我的 %{REQUEST_METHOD} 条件在我的 apache .conf 文件中似乎不起作用

为什么我的 %{REQUEST_METHOD} 条件在我的 apache .conf 文件中似乎不起作用

我试图减少Access-Control-Allow-Origin仅针对某些特定场景(例如仅针对特定请求方法)发送响应的情况。在这种情况下,我们已经在针对特定目录的所有请求中包含了响应标头,但在添加If以下条件后,它似乎不再起作用。

<Directory "/var/www/myapp">
<If "%{REQUEST_METHOD} == 'HEAD'"> 
  Header set Access-Control-Allow-Origin 'https://some.example.com'
</If>
</Directory>

更重要的是,我也尝试过通过各种方式调试这个问题,从我所知道的情况来看,这个%{REQUEST_METHOD}变量没有被正确解析。以下是我迄今为止为确定这一点而进行的测试。

没有条件包含预期的标题。

<Directory "/var/www/myapp">
  Header set Access-Control-Allow-Origin 'https://some.example.com'
</Directory>

条件应始终为真,并包含预期的标题。

<Directory "/var/www/myapp">
<If "'HEAD' == 'HEAD'"> 
  Header set Access-Control-Allow-Origin 'https://some.example.com'
</If>
</Directory>

添加一个标题来回显所解析的值%{REQUEST_METHOD}似乎会破坏 Apache,响应返回时没有标题,看起来像是处理中的错误。

<Directory "/var/www/myapp">
  Header set X-Method "%{REQUEST_METHOD}"
  Header set Access-Control-Allow-Origin 'https://some.example.com'
</Directory>

我不禁想到一定是我的语法出了问题,但我已经检查了好几遍,并没有发现什么问题。

答案1

我找到了一种解决方法,到目前为止似乎对我有用,但我仍然想了解为什么我最初使用If条件的尝试没有奏效。对我来说,下面的解决方法比我最初的尝试更难理解。

<Directory "/var/www/myapp">
  RewriteCond %{REQUEST_METHOD} 'HEAD'
  RewriteRule ^ - [ENV=cors:true]
  Header set Access-Control-Allow-Origin 'https://some.example.com' env=cors
</Directory>

感谢以下参考资料帮助我发现了这个解决方法:

相关内容