【问题标题】:NGINX: using regex from variableNGINX:使用变量中的正则表达式
【发布时间】: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;

【问题讨论】:

    标签: nginx cors


    【解决方案1】:

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

    您可以直接使用if 指令,如果需要,将整个指令放入一个单独的文件中,然后将include 替换为您希望评估$http_origin 的位置.

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

    你显然不能像你尝试做的那样做你想做的事,但这些替代方案似乎相当充分和合理。

    【讨论】:

    • 我确实可以将 $http_origin 的检查移至位置环境,只要我在 enable-cors.org 示例中将 $cors 硬编码为“true”。我会尝试并发布我的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2016-01-09
    • 2012-11-24
    • 1970-01-01
    • 2018-09-12
    • 2021-03-15
    相关资源
    最近更新 更多