如果 URL 包含术语,则在 apache2 中设置标头

如果 URL 包含术语,则在 apache2 中设置标头

使用 Apache 2.4.29,如果 URL 包含特定术语(api),则设置一些标题。

这是我在配置文件中设置的尝试

RewriteEngine On
RewriteCond %{REQUEST_URI} api ENV=SIGN2
Header set "Access-Control-Allow-Origin" "*" env=SIGN2
Header set "Access-Control-Allow-Headers" "*" env=SIGN2

我也尝试过:

SetEnvIf REQUEST_URI ".*api.*" SIGN
Header set Access-Control-Allow-Origin "*" env=SIGN
Header set Access-Control-Allow-Headers "*" env=SIGN

但那没有用。

URL 可能看起来像这样:

  • https://www.example.com/api/something/another/last这应该设置标题

  • https://test.example.com/api/something/another/last这应该设置标题

  • https://prod.example.com/api/something/another/last这应该设置标题

  • https://www.example.com/hello/world/test这不应该。

答案1

示例 URL 并未指向实际目录。

在这种情况下,请求可能会被重写到路由 API 调用的前端控制器?

当重写过程在第一次重写(在目录/.htaccess上下文中)后“循环”时,在初始阶段设置的任何环境变量都以 为前缀REDIRECT_。因此,如您的示例所示,SIGN被重命名为REDIRECT_SIGN。因此,可能需要检查的是这个环境变量,而不是SIGN

例如:

SetEnvIf Request_URI "^/api" SIGN
Header set Access-Control-Allow-Origin "*" env=REDIRECT_SIGN
Header set Access-Control-Allow-Headers "*" env=REDIRECT_SIGN

对于以下请求开始 /api

这似乎违反直觉,但目录上下文SIGN环境变量在处理的第一阶段设置,Header指令在处理的第二(或第三……)阶段后期处理。

如果有额外的重写循环(不太可能),那么这个环境变量将进一步重命名为REDIRECT_REDIRECT_SIGN等等。

如果指令直接位于主服务器配置或虚拟主机中,则这不是问题。

RewriteCond %{REQUEST_URI} api ENV=SIGN2

顺便说一句,这完全无效,会破坏您的服务器。您可以使用RewriteRule指令设置环境变量,正如@EOhm 指出的那样。

答案2

我不知道 SetEnvIf 但对于 mod_rewrite 我可以告诉您应该做什么(无论如何我们都使用 mod_rewrite 因此可以将其用于它提供的所有功能)。

RewriteEngine On
RewriteRule ^/api(/.*)?$ - [E=SIGN2:1]
Header set Access-Control-Allow-Origin "*" env=SIGN2
Header set Access-Control-Allow-Headers "*" env=SIGN2

据我所知,RewriteCond 不提供更改环境的选项(它旨在用作 RewriteRule 的过滤和一些有限的预处理)。
此机制有效。可能存在一些极端情况,看起来它不起作用并且需要修改,因此如果这不起作用,您应该说明您得到的结果而不是预期结果。

另外,我敢肯定,至少在 Apache 2.2 中,存在一个文档错误。1如果您使用 Mod 以便 mod_header Header 指令识别它,则需要将变量设置为显式值(如我的示例所示)(mod_rewrite 声明它会设置变量,即使没有提供任何值,而 Header 声明它只是检查变量是否已设置 - 我花了很长时间才找出为什么这样的 cinstruct 不起作用...)。

相关内容