修复 NGINX 中的“Access-Control-Allow-Origin”标头包含多个值错误

戴维

我正在建立一个 Wordpress 网站(例如http://api.example.com),以便从另一个静态的 HTML/JS 网站(例如https://test.example.com使用它的 API

这两个网站都托管在 Nginx 服务器上,每个网站都配置了一个 conf 文件,并且各自正常运行。nginx -t没有错误,我可以按预期完全访问这两个网站。

不幸的是,我遇到了 CORS 问题。尝试从 读取媒体(图像、视频)内容时api.example.com,会test.example.com在浏览器控制台中产生以下错误:

Access to XMLHttpRequest at 
'https://api.example.com/wp-json/custom-post/v1/some-data/' 
from origin 'https://test.example.com' has been blocked by CORS policy: 

The 'Access-Control-Allow-Origin' header contains multiple values
'https://test.example.com, https://test.example.com', 
but only one is allowed.

此外,在 Chrome 上,此错误之后是 CORB 错误 ( Cross-Origin Read Blocking (CORB) blocked cross-origin response https://api.example.com/wp-json with MIME type application/json.)。

在浏览器中检查请求标头时,我注意到这些属性的冗余值:

Access-Control-Allow-Credentials: true, true
Access-Control-Allow-Origin: https://test.example.com, https://test.example.com

感觉Access-Control-Allow-Origin某处可能有多余的内容,我已经在nginx.conf文件和 中的所有conf文件中寻找它sites-enabled,但无济于事。我还查看了 Wordpress 应用程序的源代码,包括使用的插件,用于注入此标头。没有找到。

最后,我尝试删除api.example.com.conf添加Access-Control-Allow-Origin标题中的一行- 它No 'Access-Control-Allow-Origin' header is present on the requested resource在浏览器控制台中为媒体内容产生纯粹而简单的错误。有趣的是,它不再产生 JSON 的 CORB 错误,并且test.example.com能够从 JSON 文件中读取文本内容。

这是api.example.com.conf文件的内容

server {
    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/api.example.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

    root /var/www/example.com/backend;
    server_name api.example.com;
    access_log /var/log/nginx/unicorn_access.log;
    error_log /var/log/nginx/unicorn_error.log;

    charset                     utf-8;
    gzip                        off;

    # Set CORS policy
    set $cors_origin            "";
    set $cors_cred              "";
    set $cors_header            "";
    set $cors_method            "";

    if ($http_origin ~ '^https?:\/\/(localhost|test.example\.com)$') {
        set $cors_origin        $http_origin;
        set $cors_cred          true;
        set $cors_header        $http_access_control_request_headers;
        set $cors_method        $http_access_control_request_method;
    }

    add_header Access-Control-Allow-Origin      $cors_origin;
    add_header Access-Control-Allow-Credentials $cors_cred;
    add_header Access-Control-Allow-Headers     $cors_header;
    add_header Access-Control-Allow-Methods     $cors_method;

    location / {
        index                   index.php index.html;
        try_files               $uri $uri/ /index.php?$args;
    }

    client_max_body_size        50m;

    # Add trailing slash to */wp-admin requests.
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;

    # Prevents hidden files (beginning with a period) from being served
    location ~ /\. {
        access_log              off;
        log_not_found           off;
        deny                    all;
    }

    # Send 'expires' headers and turn off 404 logging
    location ~* ^.+.(xml|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        access_log              off;
        log_not_found           off;
        expires                 max;
    }

    # Pass all .php files onto a php-fpm or php-cgi server
    location ~ \.php$ {
        try_files               $uri =404;
        include                 /etc/nginx/fastcgi_params;
        fastcgi_read_timeout    3600s;
        fastcgi_buffer_size     128k;
        fastcgi_buffers         4 128k;
        fastcgi_param           SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass            unix:/run/php/php7.2-fpm.sock;
        fastcgi_index           index.php;
    }

    # Robots
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # Restrictions
    location ~* /(?:uploads|files)/.*\.php$ {
        deny all;
    }
}

我希望test.example.com从 消费任何内容api.example.com,但我无法完全做到这一点。

谢谢你的帮助!

戴维

这是由于rest_send_cors_headers过滤器 REST API 挂钩到rest_pre_serve_request. 它发送带有API 请求的CORS 标头

可以通过以下操作将其关闭:

add_action('rest_api_init', function() {
    remove_filter('rest_pre_serve_request', 'rest_send_cors_headers');
}, 15);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

NGINX'Access-Control-Allow-Origin'标头包含多个值

如何修复“'Access-Control-Allow-Origin' 标头包含多个值 '*、*',但只允许一个。”?

“ Access-Control-Allow-Origin”标头包含多个值

“ Access-Control-Allow-Origin”标头包含多个值

Beego - 修复无“Access-Control-Allow-Origin”标头

CORS问题:“ Access-Control-Allow-Origin”标头不得包含多个值

“ Access-Control-Allow-Origin”标头包含多个值“ *,*”,但只允许一个

如何防止“ Access-Control-Allow-Origin”标头包含多个值

从Angular JS调用到Web API错误:“ Access-Control-Allow-Origin”标头包含多个值,因此不允许访问Origin

如何修复“Access-Control-Allow-Origin”标头的值不等于 Webview Android 上提供的原点?

Laravel 修复请求的资源上不存在“Access-Control-Allow-Origin”标头

如何修复 angular 1 + ajax + CORS 策略上的 No 'Access-Control-Allow-Origin' 标头?

Spring Boot - 'Access-Control-Allow-Origin' 标头包含多个值,但期望只有一个

多个Access-Control-Allow-Origin标头

CORS – 跨域请求被阻止 – 'Access-Control-Allow-Origin' 标头包含无效值

获取Access-Control-Allow-Origin标头错误

Foursquare返回“ No access control allow origin”标头存在错误

(Laravel和Nginx)CORS标头'Access-Control-Allow-Origin'与'(null)'不匹配

如何修复python socket-io服务器中的“ Access-Control-Allow-Origin”错误

PHP Nginx 没有“Access-Control-Allow-Origin”错误

在Aurelia中添加“ Access-Control-Allow-Origin”标头

在IIS中修改Access-Control-Allow-Origin标头

CORS 政策问题刚刚开始,没有更改代码 - “CORS 政策:'Access-Control-Allow-Origin' 标头包含多个值”

Wordpress functions.php 中的多个 Access-Control-Allow-Origin CORS 标头

请求的资源错误中不存在“ Access-Control-Allow-Origin”标头

错误:CORS 政策:ionic 4 中不存在“Access-Control-Allow-Origin”标头

不允许多个 CORS 标头“Access-Control-Allow-Origin”/缺少 CORS 标头“Access-Control-Allow-Origin”)

Access-Control-Allow-Origin标头必须包含方案吗?

表单提交失败::响应必须包含AMP-Access-Control-Allow-Source-Origin标头