返回
创建于
状态公开
Nginx 默认对同一个响应头 不会覆盖,只会追加多个值,导致浏览器报错,例如出现两个 Access-Control-Allow-Origin。
要 覆盖 Access-Control-Allow-Origin,你需要:
方法 1:使用 always 并明确设置覆盖
1add_header Access-Control-Allow-Origin "*" always;always 会确保在所有状态码下写入,同时会覆盖已有的同名响应头。
方法 2:先清除 Proxy 返回的同名 Header(推荐)
如果后端也返回了 Access-Control-Allow-Origin,Nginx 可能会合并,导致重复。
可以用 proxy_hide_header 清除后端的:
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 模块)
1more_clear_headers 'Access-Control-Allow-Origin';
2more_set_headers 'Access-Control-Allow-Origin: *';最常见的正确写法示例
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}