我在使用 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;
}