首页 > 解决方案 > 可以使用“if”来设置 CORS 标头吗?

问题描述

处理 CORS 请求的常见解决方案如下:

location ... {
    add_header  Access-Control-Allow-Origin       ...;
    add_header  Access-Control-Allow-Credentials  ...;
    add_header  Access-Control-Allow-Headers      ...;
    add_header  Access-Control-Allow-Methods      ...;

    if ($request_method = 'OPTIONS') {
        add_header  Access-Control-Allow-Origin       ...;
        add_header  Access-Control-Allow-Credentials  ...;
        add_header  Access-Control-Allow-Headers      ...;
        add_header  Access-Control-Allow-Methods      ...;
        return 204;
    }
}

但却if邪恶的。以这种方式使用它是否安全?

UPD顺便说一句,据add_header所知,不需要重复的。

标签: nginxcors

解决方案


你不需要一个if. 取几个maps(在locationserver块之外 -> 仅在http块中起作用)。

map $request_method $one
{
    default '…';
    get '…';
    options '…';
    post '…';
}

map $request_method $two
{
    default '…';
    get '…';
    options '…';
    post '…';
}

map $request_method $three
{
    default '…';
    get '…';
    options '…';
    post '…';
}

map $request_method $four
{
    default '…';
    get '…';
    options '…';
    post '…';
}

字符串匹配忽略大小写。只要它不是正常的正则表达式。

的第一个参数map是输入(在这种情况下$request_method)。根据匹配,在映射的第二个参数中创建一个新变量(在本例$one中为$two, $three, $four(您可以根据需要命名)),其中包含匹配的'…'内容。

more_set_headers 'Access-Control-Allow-Origin: $one';
more_set_headers 'Access-Control-Allow-Credentials: $two';
more_set_headers 'Access-Control-Allow-Headers: $three';
more_set_headers 'Access-Control-Allow-Methods: $four';

未经测试。


推荐阅读