27

我正在寻找一个 nginx 配置设置,它确实Access-Control-Allow-OriginOrigin.

似乎该*方法不适用于 Chrome,并且多个 URL 不适用于 Firefox,因为 CORS 规范不允许这样做。

到目前为止,唯一的解决方案是将 设置为Access-Control-Allow-Origin在源中接收到的值(是的,可以实施一些验证)。

问题是如何在 nginx 中做到这一点,最好不安装额外的扩展。

set $allow_origin "https://example.com"
# instead I want to get the value from Origin request header
add_header 'Access-Control-Allow-Origin' $allow_origin;
4

3 回答 3

46

使用if有时会破坏其他配置,例如try_files. 您最终可能会遇到意外的 404。

改用地图

map $http_origin $cors_header {
    default "";
    "~^https?://[^/]+\.example\.com(:[0-9]+)?$" "$http_origin";
}

server {
    ...
    location / {
        add_header Access-Control-Allow-Origin $cors_header;
        try_files $uri $uri/ /index.php;
    }
    ...
 }

如果是邪恶的

于 2015-03-18T04:06:05.110 回答
24

我自己开始使用它,这是我当前 Nginx 配置中的一行:

add_header 'Access-Control-Allow-Origin' "$http_origin";

这将设置一个标头以允许请求的来源作为唯一允许的来源。因此,无论您来自哪里,都是唯一允许的地方。所以它应该与允许“*”没有太大不同,但从浏览器的角度来看它看起来更具体。

此外,您可以在 Nginx 配置中使用条件逻辑来指定允许的主机名白名单。这是来自https://gist.github.com/Ry4an/6195025的示例

if ($http_origin ~* (whitelist\.address\.one|whitelist\.address\.two)$) {
  add_header Access-Control-Allow-Origin "$http_origin";
}

我计划在我自己的服务器上尝试这种技术,以将允许的域列入白名单。

于 2014-01-14T23:57:08.290 回答
0

这是来自 conf.f 目录的文件的一部分,人们总是在其中描述他们的 Nginx 虚拟主机。$http_origin 与 allowed_origins 列表进行比较,然后在第二个映射块中,系统根据允许的列表决定将什么写入“header Access-Control-Allow-Origin”。这是代码的一部分。

#cat /etc/nginx/conf.d/somehost.conf

map $http_origin $origin_allowed {
        default 0;
        https://xxxx.yyyy.com 1;
        https://zzz.yyyy.com 1;
}
map $origin_allowed $origin {
        default "";
        1 $http_origin;
}
    
server {
       server_name somehost.com;
    #...[skipped text]
    add_header Access-Control-Allow-Origin $origin always;
    #....[skipped text]
}

我在我的服务器上测试它。一切正常。祝你有美好的一天,身体健康,尤金。

于 2021-10-14T13:42:25.933 回答