NGINX:使用变量的正则表达式

时间:2014-01-07 08:34:15

标签: nginx cors

我正在尝试根据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

1 个答案:

答案 0 :(得分:0)

为什么需要一个中间变量,您需要比较$http_origin

您可以直接使用if指令,如果需要,将整个指令放在一个单独的文件中,然后include代替您想要的位置$http_origin进行了评估。

或者,如果您已将整个cors_handling放在单独的文件中,只需将标题if(与$http_origin进行比较)移回实际的location(甚至整个server)。

你显然不能像你尝试过的那样做你想做的事情,但这些替代方案似乎非常充足和合理。