如何根据请求中的Origin头正确设置nginx Access-Control-Allow-Origin到响应头?

时间:2013-01-24 10:40:04

标签: javascript nginx cors

我正在寻找一个nginx配置设置,它会将Access-Control-Allow-Origin设置为Origin中收到的值。

似乎*方法无法与Chrome配合使用,多个网址无法与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;

2 个答案:

答案 0 :(得分:35)

使用if有时会破坏其他配置,例如try_files。你最终会得到意想不到的404。

Use map instead

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;
    }
    ...
 }

If is evil

答案 1 :(得分:19)

我自己开始使用它,这是我当前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";
}

我计划在自己的服务器中尝试使用此技术将允许的域列入白名单。