跨域问题的原因的常见解决思路

1. 什么是跨域问题?

跨域问题(Cross-Origin Resource Sharing,CORS)是指浏览器出于安全考虑,阻止网页向不同源的服务器发起请求。同源策略(Same-Origin Policy,SOP) 规定:

  • 协议(http/https)、域名(example.com)、端口(:80/:443)必须相同,否则就会触发跨域限制。

例如以下情况都会触发跨域:

情况 示例 是否跨域
协议不同 http://example.comhttps://example.com ❌跨域
域名不同 https://example.comhttps://api.example.com ❌跨域
端口不同 http://example.com:3000http://example.com:8080 ❌跨域
同源 https://example.com:443https://example.com:443 ✅ 不跨域

2. 常见的跨域解决方案

方法 适用场景 实现方式
CORS(后端允许跨域) 推荐方式,适用于所有请求 在服务器添加 Access-Control-Allow-Origin
JSONP(仅支持 GET) 仅支持 GET 请求 前端 <script> 请求,后端返回 callback(data)
Nginx 反向代理 代理跨域请求 通过 Nginx proxy_pass 转发请求
前端 Webpack/Vite 代理 本地开发时解决跨域 proxy 代理后端请求到相同源
同源部署 生产环境 将前端和后端放在同一域名

3. 具体解决方案(部分)

(1)CORS 解决跨域(后端配置)

适用于所有请求方式(GET, POST, PUT, DELETE 等)

  • Node.js/Express 示例:
    const cors = require('cors');
    app.use(cors()); // 允许所有域访问
    
  • 手动设置 HTTP 头:
    res.setHeader("Access-Control-Allow-Origin", "*");
    res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
    res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
    

(2)Nginx 反向代理

适用于前端请求同源但后端不同源,这个简单好用,很推荐

server {
    location /api/ {
        proxy_pass http://backend.com/;
        proxy_set_header Host backend.com;
    }
}

(3)同源部署

适用于生产环境

  • 直接在后端提供静态文件(如 React/Vue 前端):
    app.use(express.static('public'));
    
  • 确保前端请求的是相对路径 fetch("/api/data") 而不是绝对路径 fetch("https://api.example.com/data")

4. 总结

  1. 跨域是由于浏览器的同源策略导致的安全限制(协议、域名、端口不同就会跨域)。
  2. 解决方案:
    • 推荐 CORS(后端允许跨域)
    • JSONP(仅支持 GET 请求,较少使用)
    • Nginx 反向代理(适用于生产环境)
    • Webpack/Vite 代理(适用于本地开发)
    • 同源部署(根本上避免跨域)

你可以根据具体场景选择最适合的解决方案 🚀!

posted @   hk416hasu  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示