【发布时间】:2014-01-23 04:40:45
【问题描述】:
我正在尝试在我的 NGINX 虚拟主机定义中实现 CORS,基于来自 http://enable-cors.org/server_nginx.html 的配置。我想要实现的是在我的虚拟主机定义中分配一个变量 $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"
还有一些其他的变体,我用/foo/ 替换了$valid_cors_origin,但由于它似乎没有被评估,我认为我分配给$valid_cors_origin 并不重要。
这在 NGINX 中是否可行,和/或是否有其他模块化方法可以解决此问题?基本要求:我希望能够从 vhost 文件中完全管理我的有效来源,并尽可能保持cors_handling 配置的通用性。
更新: 我终于有时间测试@cnst 提出的解决方案,它运行良好。为了完整起见,我从文件 cors_handling 中删除了对 $http_origin 的检查,并将检查移至 vhost 本身,我可以在其中执行此操作:
if ($http_origin ~* (regex|for|my|httporigin)) {
set $cors "true";
}
include cors_handling;
【问题讨论】: