返回
创建于
状态公开

Nginx 默认对同一个响应头 不会覆盖,只会追加多个值,导致浏览器报错,例如出现两个 Access-Control-Allow-Origin

覆盖 Access-Control-Allow-Origin,你需要:

方法 1:使用 always 并明确设置覆盖

nginx
1add_header Access-Control-Allow-Origin "*" always;

always 会确保在所有状态码下写入,同时会覆盖已有的同名响应头。


方法 2:先清除 Proxy 返回的同名 Header(推荐)

如果后端也返回了 Access-Control-Allow-Origin,Nginx 可能会合并,导致重复。

可以用 proxy_hide_header 清除后端的:

nginx
1proxy_hide_header Access-Control-Allow-Origin;
2
3add_header Access-Control-Allow-Origin "*" always;
4add_header Access-Control-Allow-Methods "GET, POST, OPTIONS" always;
5add_header Access-Control-Allow-Headers "Content-Type, Authorization" always;

方法 3:使用 more_clear_headers(需要安装 nginx-extras 或 headers-more 模块)

nginx
1more_clear_headers 'Access-Control-Allow-Origin';
2more_set_headers 'Access-Control-Allow-Origin: *';

最常见的正确写法示例

nginx
1location /api/ {
2    proxy_pass http://backend;
3
4    proxy_hide_header Access-Control-Allow-Origin;    # 移除后端的
5    proxy_hide_header Access-Control-Allow-Credentials;
6
7    add_header Access-Control-Allow-Origin "*" always;
8    add_header Access-Control-Allow-Credentials true always;
9    add_header Access-Control-Allow-Methods "GET, POST, OPTIONS" always;
10    add_header Access-Control-Allow-Headers "Content-Type, Authorization" always;
11
12    if ($request_method = OPTIONS) {
13        return 204;
14    }
15}