使用 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 不起作用...)。