我正在尝试根据http://enable-cors.org/server_nginx.html的配置在我的NGINX vhost定义中实现CORS。我想要实现的是在我的vhost定义中分配一个变量$ valid_cors_origin,然后包含一个处理所有CORS验证的不同文件,如下所示:
location / {
...
$valid_cors_origin = "foobar";
include cors_handling;
}
虽然我从enable-cors.org的示例中删除了location
环境。在此设置中,以下内容适用于cors_handling
:
if ($http_origin = "${valid_cors_origin}"){
set $cors "true";
}
只要我将Origin: foobar
标题添加到我的请求中,很明显。
在enable-cors.org的示例中,他们使用正则表达式来匹配$http_origin
。我希望能够做同样的事情,因此需要为变量$valid_cors_origin
分配正则表达式。问题是变量似乎没有在if语句中进行评估。到目前为止,我已经尝试了以下,没有任何运气:
$valid_cors_origin = "/(foo|bar)/";
if ($http_origin *~ $valid_cors_origin){
set $cors "true";
}
离开我
[notice] 43797#0: *1 $valid_cors_origin does not match "foobar"
尝试强制进行字符串评估:
if ($http_origin *~ "${valid_cors_origin}"){
set $cors "true";
}
[notice] 43797#0: *1 "${valid_cors_origin}" does not match "foobar"
我用$valid_cors_origin
替换了/foo/
的其他一些变体,但由于它似乎没有被评估,我认为我分配给{{1}并不重要}。
这在NGINX中是否可行,和/或是否有其他模块化方法可以解决这个问题?基本要求:我希望能够从vhost文件中完全管理我的有效来源,并使$valid_cors_origin
配置尽可能保持通用。
更新: 我终于有时间来测试@cnst提出的解决方案了,它运行正常。为了完整,我从文件cors_handling中删除了$ http_origin的检查,并将检查移动到vhost本身,我可以在这里执行此操作:
cors_handling
答案 0 :(得分:0)
为什么需要一个中间变量,您需要比较$http_origin
?
您可以直接使用if
指令,如果需要,将整个指令放在一个单独的文件中,然后include
代替您想要的位置$http_origin
进行了评估。
或者,如果您已将整个cors_handling
放在单独的文件中,只需将标题if
(与$http_origin
进行比较)移回实际的location
(甚至整个server
)。
你显然不能像你尝试过的那样做你想做的事情,但这些替代方案似乎非常充足和合理。