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
(不区分大小写的匹配在这里似乎也是多余的。)
我需要在本地主机的不同端口从两个不同的应用程序 运行 访问域 (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
(不区分大小写的匹配在这里似乎也是多余的。)