当前位置: 首页 > news >正文

Nginx 跨域(CORS)配置详细介绍

跨域资源共享(CORS)是现代浏览器安全策略的一部分,Nginx可以通过配置响应头来解决跨域问题。以下是完整的配置方案:

基础跨域配置

在Nginx配置文件的 serverlocation 块中添加以下指令:

location / {# 允许所有域名跨域访问(生产环境应限制为具体域名)add_header 'Access-Control-Allow-Origin' '*';# 允许的请求方法add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';# 允许的请求头add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization';# 预检请求(OPTIONS)缓存时间add_header 'Access-Control-Max-Age' 1728000;# 允许浏览器在跨域请求中携带Cookieadd_header 'Access-Control-Allow-Credentials' 'true';# 处理OPTIONS预检请求if ($request_method = 'OPTIONS') {return 204;}
}

生产环境推荐配置

map $http_origin $cors_origin {default "";"~^https://(www\.)?yourdomain\.com$" $http_origin;"~^https://(.*\.)?yourotherdomain\.com$" $http_origin;
}server {location /api/ {# 动态设置允许的源add_header 'Access-Control-Allow-Origin' $cors_origin;add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With';add_header 'Access-Control-Expose-Headers' 'Content-Length, Content-Range';add_header 'Access-Control-Allow-Credentials' 'true';if ($request_method = 'OPTIONS') {add_header 'Access-Control-Max-Age' 1728000;add_header 'Content-Type' 'text/plain; charset=utf-8';add_header 'Content-Length' 0;return 204;}# 你的其他代理配置...proxy_pass http://backend;}
}

常见问题解决方案

  1. 多个域名配置

    map $http_origin $cors_origin {default "";"~^https://(www\.)?domain1\.com$" $http_origin;"~^https://(www\.)?domain2\.com$" $http_origin;
    }
    
  2. 携带Cookie问题

    • 必须指定具体域名(不能是*)
    • 必须设置 Access-Control-Allow-Credentials: true
    • 前端需要设置 withCredentials: true
  3. 自定义头问题

    add_header 'Access-Control-Allow-Headers' 'X-Custom-Header, Authorization';
    
  4. Vue/React开发环境代理

    location /api {proxy_pass http://localhost:8080;proxy_set_header Host $host;# 跨域头设置...
    }
    

配置测试方法

  1. 检查Nginx配置语法:

    sudo nginx -t
    
  2. 重载Nginx配置:

    sudo nginx -s reload
    
  3. 使用curl测试:

    curl -I -X OPTIONS http://yourdomain.com/api -H "Origin: http://test.com"
    
  4. 浏览器开发者工具检查响应头

注意事项

  1. 生产环境不要使用 Access-Control-Allow-Origin: *Access-Control-Allow-Credentials: true 同时存在
  2. 对于简单请求(GET/POST/HEAD)和预检请求(OPTIONS)都要正确处理
  3. 缓存控制头不要覆盖CORS头
  4. 使用HTTPS时确保所有来源也是HTTPS

正确配置CORS可以确保你的API安全地支持跨域访问,同时防止CSRF等安全问题。

http://www.lryc.cn/news/612098.html

相关文章:

  • 【教程】C++编译官方CEF3
  • [Oracle] NVL()函数
  • Python:文件管理
  • 玳瑁的嵌入式日记D13-0806(C语言)
  • 【运维进阶】DHCP服务配置和DNS域名解析
  • TypeScript ActionScript
  • 浅谈RNN被Transformer 取代的必然性
  • Kotlin Native调用C curl
  • Uniapp生物识别(SOTER)
  • 【第5话:相机模型1】针孔相机、鱼眼相机模型的介绍及其在自动驾驶中的作用及使用方法
  • 第二十六天(数据结构:树(补充版程序请看下一篇))
  • 数字图像处理(冈萨雷斯)第三版:第四章——空间滤波与频域滤波(平滑与锐化)——主要内容和重点
  • 【PHP 抽象类完全指南(含 PHP 8.4 新特性)】
  • 02.【数据结构-C语言】顺序表(线性表概念、顺序表实现:增删查、前向声明、顺序表实现通讯录项目:增删改查、通讯录数据导入及保存到本地文件)
  • Linux操作系统启动项相关研究与总结
  • Redis面试精讲 Day 12:Redis Sentinel哨兵机制详解
  • 深度学习(pytorch版)前言:环境安装和书籍框架介绍
  • 单变量单步时序预测:CNN-GRU卷积神经网络结合门控循环单元
  • Linux系统编程——环境变量、命令行参数
  • mysql8.0主从节点克隆
  • Numpy科学计算与数据分析:Numpy入门之多平台安装与基础环境配置
  • 用NAS如何远程访问:详细教程与实用技巧
  • 强强联合:OpenAI正式登陆AWS!
  • 【motion】标签体系设计与检索 1:HumanML3D 和 KIT Motion-Language(KITML)
  • 《Vue 3与Element Plus构建多语后台的深层架构》
  • 导入Excel打印
  • GEAR:一种高效的 KV Cache 压缩方法,用于几乎无损的大语言模型生成式推理
  • 云手机对于网络游戏的作用
  • linux下的串口通信原理及编程实例
  • 【完整源码+数据集+部署教程】耳镜耳部疾病分类系统源码和数据集:改进yolo11-HSFPN