nginx 解决跨域问题

解决跨域问题解决

1)后台去增加处理,解决跨域问题。

2)nginx布署的时候处理,解决跨域问题。

下面以域名www.xxx.com为宿主域名,当然也可以是二级域名:app.xxx.com等等。

配制如下:

复制代码
add_header 'Access-Control-Allow-Origin' 'https://www.xxx.com' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;

表明:指定的域名可以上传。

然后会报一个:

chunk-vendors.3e57df28.js:13 Refused to get unsafe header "content-disposition"

复制代码
add_header 'Access-Control-Expose-Headers' 'Content-Disposition' always; 

这样就可以处理好了。

跨域解决可能方案

这份配置 能解决大部分跨域场景,但存在一个关键细节问题,修复后可覆盖绝大多数实际需求。以下是详细分析:

一、当前配置的跨域支持(已生效部分)

你配置的跨域响应头,已经覆盖了核心场景:

nginx

复制代码
add_header 'Access-Control-Allow-Origin' '*' always;  # 允许所有域名跨域(简单场景够用)
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;  # 允许常用请求方法
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;  # 允许常用自定义头
add_header 'Access-Control-Allow-Credentials' 'true' always;  # 允许携带 Cookie/凭证
已支持的场景:
  1. 简单跨域请求(GET/POST,无自定义头、Cookie);
  2. 带自定义头(如 Authorization、Content-Type: application/json)的预检请求(OPTIONS);
  3. 携带 Cookie / 凭证的跨域请求。

二、关键问题:Access-Control-Allow-Origin: * 与凭证冲突

问题描述:

当你设置 Access-Control-Allow-Credentials: true(允许携带凭证)时,Access-Control-Allow-Origin 不能设为 *(通配符),否则浏览器会拒绝跨域(违反 CORS 规范)。

后果:

如果前端请求时携带了 Cookie、Token 等凭证,浏览器会报如下错误:

plaintext

复制代码
The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.

三、修复方案(根据你的实际需求选择)

方案 1:不需要携带凭证(大部分上传场景适用)

如果前端上传文件时不需要带 Cookie/Token,直接删除 Access-Control-Allow-Credentials: true,保留 * 通配符即可(最简单):

nginx

复制代码
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;
# 删掉这行:add_header 'Access-Control-Allow-Credentials' 'true' always;
方案 2:需要携带凭证(如登录态、Token)

如果前端必须携带 Cookie / 凭证,需将 Access-Control-Allow-Origin 设为 具体的允许域名 (不能用 *),同时保留 Credentials: true:

nginx

复制代码
# 替换 * 为你的前端域名(如 https://www.xxx.com,注意不带 /)
add_header 'Access-Control-Allow-Origin' 'https://www.xxx.com' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
方案 3:允许多个域名携带凭证(进阶需求)

如果需要支持多个前端域名跨域且携带凭证,需用 Nginx 变量动态匹配请求源:

nginx

复制代码
# 先定义允许的域名列表
map $http_origin $allow_origin {
    ~^https?://(www\.xxx\.com|admin\.xxx\.com)$ $http_origin;  # 允许的域名
    default "";  # 其他域名拒绝
}

# 再使用变量设置响应头
add_header 'Access-Control-Allow-Origin' $allow_origin always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;

四、补充:优化 OPTIONS 预检请求(可选但推荐)

跨域请求中,复杂请求(如带自定义头、POST 非 form-data 格式)会先发送 OPTIONS 预检请求。为了提升性能,可直接返回 204 状态码,无需转发到业务逻辑:

nginx

复制代码
# 专门处理 OPTIONS 预检请求
location / {
    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' 'https://www.xxx.com' always;  # 与上面一致
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
        add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;
        add_header 'Access-Control-Allow-Credentials' 'true' always;
        add_header 'Content-Length' 0;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        return 204;  # 成功且无响应体,提升性能
    }
    # 原有的静态文件配置...
    root D:/platform/plaftform-plus/upload;
    index index.html;
    try_files $uri $uri/ =404;
}

# /upload 路径也建议添加 OPTIONS 处理,逻辑同上
location /upload {
    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' 'https://www.xxx.com' always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
        add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;
        add_header 'Access-Control-Allow-Credentials' 'true' always;
        add_header 'Content-Length' 0;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        return 204;
    }
    # 原有的 alias、limit_except 等配置...
}

五、最终结论

  1. 修复 Access-Control-Allow-Origin: * 与 Credentials: true 的冲突后,这份配置 能完美解决跨域问题;
  2. 大部分文件上传场景不需要携带凭证,选择「方案 1」最简洁;
  3. 若需携带登录态 / Token,按「方案 2」或「方案 3」配置具体允许的域名;
  4. 补充 OPTIONS 预检请求处理,可提升跨域请求性能。
相关推荐
福兮说4 小时前
前端下载大文件,点了按钮半天没反应:fetch + blob 的三个问题和三种替代写法
前端·javascript·性能优化·文件下载
GreenTea4 小时前
我把 Agent 的 while 循环拆掉了:一种你可能没想到的 Agent 架构
前端·后端·架构
科技观察哨4 小时前
六足平台选型与纳米定位系统集成:HEB-640六自由度位移台在半导体光刻对准中的参数边界与国产替代评估
前端·人工智能
niucloud-admin4 小时前
JAVA V6 多商户商城 开发文档——web前端
前端
颜进强5 小时前
16 · NestJS LifecycleEvents 生命周期事件:五个钩子、三条边界,和 rag-server 的优雅停机
前端·后端·ai编程
今年下半年6 小时前
【VUE】整合腾讯地图、自定义区域边界、村委名称及资产统计(放大显示资产点位)
前端·javascript·vue.js
郑州光合科技余经理6 小时前
同城电商系统:库存变更怎么同步到订单
java·开发语言·前端·后端·uni-app·php·ai编程
2601_962381138 小时前
历史视频朝代更替动效怎么做?把 AE 关键帧换成 AI 分镜动画的实战拆解
人工智能·nginx·音视频
前端snow8 小时前
ai agent --- DeepAgents 中间件
前端
data analyse 4569 小时前
报表能自定义的国内统计工具有哪些
前端·数据分析