Nginx:被CORS策略阻止:“ Access-Control-Allow-Origin”标头包含多个值

时间:2020-09-13 14:27:12

标签: nginx nginx-reverse-proxy nginx-config

我需要启用cors策略以访问我的api,我在nginx服务器文件上进行了以下配置:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name api.domain.com;

    location / {

       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass http://my_ip:6869/;

        set $ref "*";
        if ($http_referer ~* ^(http?\:\/\/)(.*?)\/(.*)$) {
          set $ref $1$2;
        }
        add_header 'Access-Control-Allow-Origin' $ref always;
        add_header 'Access-Control-Allow-Credentials' 'true' always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,signature,timestamp' always;
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;

    }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/api.domain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/api.domain.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

但是我一直收到以下错误:

Access to fetch at 'https://api.domain.com/data/key?matches=^art(.*)' from origin 'http://localhost:3500' has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header contains multiple values '*, http://localhost:3500', but only one is allowed. Have the server send the header with a valid value, or, if an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

似乎add_header是在已经设置的Access-Control-Allow-Origin标头的顶部添加的,但是我只有这个配置文件,看不到它可能来自的其他任何地方。

是否有办法弄清楚是什么设置了初始标头cors策略,还是只是覆盖了它而不是添加它?

谢谢。

1 个答案:

答案 0 :(得分:0)

如果您没有正确设置CORS配置,则会发生这种情况。 您可以使用名为Allow-Control-Allow-Origin的插件/扩展程序在本地计算机上修复此问题,并将本地主机添加到其中。

另一种方法是在服务器端手动修复配置。

如果您不熟悉CORS,它基本上是用来允许一些跨域请求,而拒绝其他请求。例如,如果某个网站提供可嵌入的服务,则可能有必要放宽某些限制。

更新

您为Nginx使用哪个编译器?如果是this,则以下代码必须对其进行修复:

location ~* \.(eot|ttf|woff|woff2)$ {
    add_header Access-Control-Allow-Origin *;
}