Nginx 条件评估不正确

Nginx 条件评估不正确

我在使用 nginx 以及它如何评估条件时遇到了一个奇怪的问题。

相关配置如下:

set $cors FALSE;
if ($http_origin ~* (http://example.com|http://dev.example.com:8000|http://dev2.example.com)) {
  set $cors TRUE;
}

if ($request_method = 'OPTIONS') {
  set $cors $cors$request_method;
}

if ($cors = 'TRUE') {
  add_header 'Access-Test'    "$cors";
  add_header 'Access-Control-Allow-Origin'    "$http_origin";
  add_header 'Access-Control-Allow-Methods'   'POST, OPTIONS';
  add_header 'Access-Control-Max-Age'         '1728000';
}

if ($cors = 'TRUEOPTIONS') {
  add_header 'Access-Test'    "$cors";
  add_header 'Access-Control-Allow-Origin'    "$http_origin";
  add_header 'Access-Control-Allow-Methods'   'POST, OPTIONS';
  add_header 'Access-Control-Allow-Headers'   'X-Requested-With, X-Prototype-Version';
  add_header 'Access-Control-Max-Age'         '1728000';
  add_header 'Content-Type'                   'text/plain';
}

因此,条件块永远不会触发。

当我删除条件时,我看到“Access-Test”标头和“Access-Control-Allow-Origin”设置正确,但如上所述,启用条件会导致标头无法发送。

我正在通过运行进行测试:

curl -Iv -i --request "OPTIONS" -H "Origin: http://example.com" http://staging.example.com/

我是否忽略了一些显而易见的东西?我尝试过带引号和不带引号的“if”,等等。

这是 nginx 1.2.9。

答案1

好的,我显然需要在条件块中添加明确的“return”语句,然后 add_header 行才能正确触发。

因此,类似于:

if ($cors = 'TRUEOPTIONS') {
  add_header 'Access-Test'    "$cors";
  add_header 'Access-Control-Allow-Origin'    "$http_origin";
  add_header 'Access-Control-Allow-Methods'   'POST, OPTIONS';
  add_header 'Access-Control-Allow-Headers'   'X-Requested-With, X-Prototype-Version';
  add_header 'Access-Control-Max-Age'         '1728000';
  add_header 'Content-Type'                   'text/plain';

  return 204;

}

相关内容