1

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

浏览器访问的PageURL为:

http://localhost:8081/weather

内部发送 AJAX 请求到

example.com/getResponse 

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

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

现在请求标头是:

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

获取响应标头为:

Access-Control-Allow-Origin: $0

显然错误来自“CORS 被阻止:原因:CORS 标头与'$0'不匹配”。响应中存在“Access-Control-Allow-Origin”标头意味着 SetEnvIfNoCase 执行并匹配“Origin”请求标头值。

我的问题是为什么 $0 没有被匹配的整个字符串替换。?

4

1 回答 1

2

我的问题是为什么$0没有被匹配的整个字符串替换。?

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

最好是明确的并包含一个捕获组(带括号的子模式)并改用$1反向引用。

例如:

SetEnvIfNocase Origin "^(http://localhost:8085)$" CORS_ALLOW_ORIGIN1=$1

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

于 2021-03-09T16:42:58.363 回答