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

Nginx解决跨域问题

Nginx解决跨域问题详解

请求被浏览器拦截
方法1
方法2
跨域问题
不同源\n(协议/域名/端口不同)
Nginx解决方案
反向代理\n(同源转发)
添加CORS头

⭐ Nginx解决跨域的两种方式

1️⃣ 通过反向代理实现同源请求

请求API
/api/users
代理转发
http://api-server/users
返回数据
返回数据
浏览器
Nginx
(同源)
API服务器
(跨域)

💡 原理: 浏览器访问前端服务器的API路径,Nginx将请求转发到实际的API服务器,浏览器认为是同源请求

2️⃣ 通过设置CORS响应头

直接请求
添加CORS响应头
浏览器
Nginx
返回给浏览器

💡 原理: Nginx为响应添加CORS相关的HTTP头,告诉浏览器允许跨域请求

🌟 Nginx跨域配置示例

方法1: 反向代理配置

server {listen 80;server_name mywebsite.com;# 前端静态资源location / {root /var/www/html;index index.html;try_files $uri $uri/ /index.html;}# API请求代理location /api/ {# 去除/api前缀rewrite ^/api/(.*)$ /$1 break;# 代理到真实API服务器proxy_pass http://api-server.com;proxy_set_header Host api-server.com;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}

前端代码访问同源API:

// 前端代码
fetch('/api/users')  // 实际会被代理到 http://api-server.com/users.then(res => res.json()).then(data => console.log(data));

方法2: 添加CORS响应头

server {listen 80;server_name api-server.com;location / {# 允许的来源域名add_header 'Access-Control-Allow-Origin' 'https://mywebsite.com';# 允许的请求方法add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';# 允许的请求头add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';# 允许携带凭证(cookies)add_header 'Access-Control-Allow-Credentials' 'true';# 预检请求缓存时间add_header 'Access-Control-Max-Age' 1728000;# 处理OPTIONS预检请求if ($request_method = 'OPTIONS') {add_header 'Access-Control-Allow-Origin' 'https://mywebsite.com';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';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://localhost:8080;}
}

前端代码直接访问API:

// 前端代码
fetch('https://api-server.com/users', {credentials: 'include'  // 需要携带凭证时
})
.then(res => res.json())
.then(data => console.log(data));

📊 两种方法对比

特性反向代理方式CORS头方式
原理通过代理使请求同源添加HTTP头允许跨域
前端修改无需修改可能需要配置
适用场景前后端分离部署API需被多个域访问
安全性更安全(隐藏API服务器)需谨慎配置允许域
请求效率多一次请求转发直接请求
配置复杂度相对简单需详细配置头信息
维护便捷性集中式管理分散管理

💡 最佳实践技巧

动态设置允许源

# 动态设置CORS允许源
map $http_origin $cors_origin {default "";"~^https://(www\.|)mywebsite.com$" "$http_origin";"~^https://(dev\.|staging\.)mywebsite.com$" "$http_origin";
}server {# ...location /api/ {# 动态允许源add_header 'Access-Control-Allow-Origin' $cors_origin;# 其他CORS设置...# 只有当源有效时才允许凭证if ($cors_origin != "") {add_header 'Access-Control-Allow-Credentials' 'true';}# ...}
}

针对特定路径设置CORS

server {# 静态资源不需要CORSlocation /static/ {root /var/www/static;}# 只对API路径设置CORSlocation /api/ {# CORS头设置add_header 'Access-Control-Allow-Origin' 'https://mywebsite.com';# 其他CORS设置...proxy_pass http://api-backend;}
}

🎯 实际应用场景

1. 前后端分离架构

静态资源请求
/
API请求
/api/
用户浏览器
Nginx
前端资源
/var/www/html
后端API服务
10.0.0.10:8080

2. 微服务架构代理

/api/users
/api/products
/api/orders
/
用户浏览器
Nginx反向代理
用户服务
192.168.1.10:8001
产品服务
192.168.1.11:8002
订单服务
192.168.1.12:8003
前端应用
192.168.1.20:3000

📚 总结:Nginx解决跨域优势

  • ⚠️ 核心优势: 在服务器端解决跨域,对前端代码无侵入性
  • 🔑 两种方法: 可通过反向代理或添加CORS头解决跨域
  • 💪 最佳选择: 反向代理方式对于前后端分离项目更简洁高效
  • 🚀 性能考虑: 通过配置缓存和CORS预检缓存降低请求开销
  • 🔐 安全建议: 精确配置允许的源域,避免过于宽松的CORS策略

Nginx是解决跨域问题的强大工具,特别适合在生产环境中使用,提供了灵活且高性能的跨域解决方案!

http://www.xdnf.cn/news/1895.html

相关文章:

  • 信创时代开发工具选择指南:国产替代背景下的技术生态与实践路径
  • GPT-4.1模型引发独立测试中的严重对齐性问题担忧
  • Git 核心命令学习总结
  • Java后端MySQL动态语句编写
  • 淘宝店如何实现7*16小时高效运营?
  • ArkTS中的空安全:全面解析与实践
  • C++[类和对象][3]
  • websheet 之 table表格
  • 详解 LeetCode 第 242 题 - 有效的字母组
  • 游戏引擎学习第244天: 完成异步纹理下载
  • day49—双指针+贪心—验证回文串(LeetCode-680)
  • 面试常问问题:Java基础篇
  • 【金仓数据库征文】- 深耕国产数据库优化,筑牢用户体验新高度
  • 【编译原理】 第四章 自上而下语法分析
  • 【速写】钩子与计算图
  • B 树失败结点个数计算好题分享
  • 【黑马 微服务面试篇】
  • 多模态深度学习: 从基础到实践
  • 星火燎原:大数据时代的Spark技术革命在数字化浪潮席卷全球的今天,海量数据如同奔涌不息的洪流,传统的数据处理方式已难以满足实时、高效的需求。
  • windows编程字符串处理
  • 【QQMusic项目界面开发复习笔记】第二章
  • 工业相机——镜头篇【机器视觉,图像采集系统,成像原理,光学系统,成像光路,镜头光圈,镜头景深,远心镜头,分辨率,MTF曲线,焦距计算 ,子午弧矢】
  • 【TS入门笔记2---基础语法】
  • python_BeautifulSoup提取html中的信息
  • 1GB与1MB的数值换算关系
  • DeepSeek本地部署保姆级教程
  • tkinter的文件对话框:filedialog
  • Graph Database Self-Managed Neo4j 知识图谱存储实践2:通过官方新手例子入门(未完成)
  • 软考中级-软件设计师 知识点速过1(手写笔记)
  • 五一去荣昌吃卤鹅?基于Java和天地图的寻找荣昌卤鹅店实践