SetEnvIfNoCase 未正确设置变量值

SetEnvIfNoCase not setting variable value properly

我需要在本地主机的不同端口从两个不同的应用程序 运行 访问域 (example.com) 中的服务 运行,但出现 CORS 错误。

在浏览器中访问的页面 URL 是:

http://localhost:8081/weather

内部发送 AJAX 请求到

example.com/getResponse 

我在 (example.com) 的 Apache 中配置了 CORS header,如下所示:

SetEnvIfNocase Origin "http://localhost:8085" CORS_ALLOW_ORIGIN1=[=12=]
Header append Access-Control-Allow-Origin %{CORS_ALLOW_ORIGIN1}e env=CORS_ALLOW_ORIGIN1
SetEnvIfNocase Origin "http://localhost:8081" CORS_ALLOW_ORIGIN2=[=12=]
Header append Access-Control-Allow-Origin %{CORS_ALLOW_ORIGIN2}e env=CORS_ALLOW_ORIGIN2

现在请求 Header 是:

Accept:*/*
Accept-Encoding: gzip,deflate,br
Accept-Language: en-US,en;q=0.5
Connection: keep-alive
Host: example.com
Origin: http://localhost:8081
Referer: http://localhost:8081/weather
User-Agent: Mozilla

得到响应 Header 作为:

Access-Control-Allow-Origin: [=14=]

显然,错误返回为:

CORS Blocked: Reason: CORS Header does not match '[=21=]'

响应中 Access-Control-Allow-Origin Header 的存在意味着 SetEnvIfNoCase 执行并匹配 Origin Request-Header 值。

我的问题是为什么 [=20=] 没有被匹配的整个字符串替换?

My question is why [=13=] is not getting replaced by the whole string getting matched.?

这是 SetEnvIf[NoCase] 指令的类似 bug1 (IMO) 行为。在第二个参数“看起来不像”正则表达式的情况下,不会捕获整个匹配项,不会生成反向引用,而是 [=13=] 被视为文字字符串。

最好是显式的,包括一个捕获组(带括号的子模式)并改用 </code> 反向引用。</p> <p>例如:</p> <pre><code>SetEnvIfNocase Origin "^(http://localhost:8085)" CORS_ALLOW_ORIGIN1=

1 或者也许是优化?!它的行为就像一个简单的 substring().


旁白:

SetEnvIfNocase Origin "http://localhost:8085" CORS_ALLOW_ORIGIN1=[=11=]
Header append Access-Control-Allow-Origin %{CORS_ALLOW_ORIGIN1}e env=CORS_ALLOW_ORIGIN1
SetEnvIfNocase Origin "http://localhost:8081" CORS_ALLOW_ORIGIN2=[=11=]
Header append Access-Control-Allow-Origin %{CORS_ALLOW_ORIGIN2}e env=CORS_ALLOW_ORIGIN2

不清楚为什么您需要两个表达式(和两个变量),因为它们是 互斥的 事件。例如,使用以下内容可获得相同的结果:

SetEnvIf Origin "^(http://localhost:808[51])" CORS_ALLOW_ORIGIN=
Header append Access-Control-Allow-Origin %{CORS_ALLOW_ORIGIN}e env=CORS_ALLOW_ORIGIN

(不区分大小写的匹配在这里似乎也是多余的。)