【问题标题】:Nginx : blocked by CORS policy: The 'Access-Control-Allow-Origin' header contains multiple valuesNginx:被 CORS 策略阻止:“Access-Control-Allow-Origin”标头包含多个值
【发布时间】:2020-12-31 10:37:32
【问题描述】:

我需要启用 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 策略,或者只是覆盖它而不是添加它?

提前谢谢你。

【问题讨论】:

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


    【解决方案1】:

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

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

    如果您不熟悉 CORS,它基本上用于允许一些跨域请求同时拒绝其他请求。例如,如果网站提供嵌入式服务,则可能需要放宽某些限制。

    更新

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

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

    【讨论】:

    • 感谢您的回答,是的,我了解 CORS 的目的,但我需要修复服务器端,而不是使用浏览器插件,因为调用是从服务器中的另一个 web 应用程序完成的,可以不要求每个人都使用插件访问。我没有得到的是这个初始允许来源的来源,它不在我的服务器文件中,这似乎是问题,因为它最终有多个值'*'和localhost:3500,我需要它只是@ 987654323@
    • 有趣的是,几周前我遇到了同样的问题,但我没有使用 Nginx。我设法修复了它,但从未完全弄清楚问题。我认为这与我更改 IP 有关服务器/客户端(我有一个测试版本和一个生产版本,我鲁莽地在它们之间切换,有时我忘了改变它们)。
    • 感谢您的帮助,我没有使用编译器,我的意思是我使用常规的 nginx 包,我没有编译任何东西。我正在考虑编译一个以使用此模块:link 我想这将允许我用 more_set_header 覆盖标头,但希望在不必编译和使用第 3 方模块的情况下找出问题。
    • @Christophe 祝你好运!
    • “Access-Control-Allow-Origin”标头包含多个值“*、*”,但只允许一个。
    猜你喜欢
    • 2021-05-23
    • 2020-01-18
    • 2019-10-02
    • 2021-10-19
    • 2019-08-10
    • 1970-01-01
    • 2019-08-09
    • 2021-02-01
    • 1970-01-01
    相关资源
    最近更新 更多