Nginx:被CORS策略阻止';访问控制允许原点';标头包含多个值

Nginx:被CORS策略阻止';访问控制允许原点';标头包含多个值,nginx,nginx-reverse-proxy,nginx-config,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 $ho

我需要启用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_头添加到了Access Control Allow Origin*的一个已经设置好的头上,但是我只有这个配置文件,看不到它来自其他任何地方

有没有办法确定是什么设置了初始头cors策略,或者只是覆盖它而不是添加到它


提前感谢您。

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

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

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

更新

您在Nginx中使用哪种编译器?如果是,则以下代码必须修复它:

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

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

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

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

更新

您在Nginx中使用哪种编译器?如果是,则以下代码必须修复它:

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

谢谢你的回答,是的,我理解CORS的用途,但我需要修复服务器端,而不是使用浏览器插件,因为调用是从服务器中的另一个Web应用程序完成的,不能要求每个人使用插件访问。我不知道最初的允许来源是什么,它不在我的服务器文件中,这似乎是问题所在,因为它以多个值“*”结束,我需要它只是好笑,几周前我遇到了同样的问题,但我没有使用Nginx。我设法修复了它,但从未完全解决问题。我想这与我更改服务器/客户端的IP有关(我有一个测试版本和一个生产版本,我在它们之间鲁莽地切换,有时我忘记了更改它们)。谢谢你的帮助,我没有使用编译器,我的意思是我使用常规的nginx包,我没有编译任何东西。我正在考虑编译一个来使用这个模块:我想这将允许我用更多的_set_头覆盖头,但我希望在不必编译和使用第三方模块的情况下解决问题。@Christophe Good幸运!Access Control Allow Origin(访问控制允许来源)标题包含多个值“*,*”,但只允许一个值。谢谢你的回答,是的,我了解CORS的用途,但我需要修复服务器端,而不是浏览器插件,因为调用是从服务器中的另一个Web应用完成的,不能要求所有人使用插件访问。我不知道什么t get是最初的allow origin的来源,它不在我的服务器文件中,这似乎是问题所在,因为它以多个值“*”结束,我需要它只是有趣的是,几周前我遇到了同样的问题,但我没有使用Nginx。我设法修复了它,但从未完全解决问题。我想这与我changi有关ng服务器/客户端的IP(我有一个测试版本和一个生产版本,我在它们之间鲁莽地切换,有时我忘记更改它们)。谢谢你的帮助,我没有使用编译器,我的意思是我使用常规的nginx包,我没有编译任何东西。我正在考虑编译一个来使用这个模块:我想这将允许我用更多的_set_头覆盖头,但我希望在不必编译和使用第三方模块的情况下解决问题。@Christophe Good运气好!Access Control Allow Origin标头包含多个值“*,*”,但只允许一个值。