我需要从在本地主机的不同端口上运行的两个不同应用程序访问在域 (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 Blocked: Reason: CORS Header does not match '$0'”。响应中出现“Access-Control-Allow-Origin”标头意味着 SetEnvIfNoCase 执行并匹配“Origin”请求标头值。
我的问题是为什么 $0 没有被整个字符串所匹配。?
答案 0 :(得分:2)
我的问题是为什么 $0
没有被整个字符串所匹配。?
这是 SetEnvIf[NoCase]
指令的类似错误的1 (IMO) 行为。在第二个参数“看起来不像”正则表达式的情况下,不会捕获整个匹配项,也不会生成反向引用,而是将 $0
视为文字字符串。
最好是明确的并包含一个捕获组(带括号的子模式)并使用 $1
反向引用。
例如:
SetEnvIfNocase Origin "^(http://localhost:8085)$" CORS_ALLOW_ORIGIN1=$1
1 或者是优化?!它的行为就像一个简单的 substring()。