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

浏览器跨域Access-Control-Allow-Origin三五问

1.什么是浏览器跨域?

        浏览器跨域浏览器实施同源策略的安全机制,用于阻止网页从不同""(协议、域名、端口任意一个不同)的服务器请求资源。

        假设我们有两个不同的源:

        源A: http://www.example.com:80

        源B: http://api.another.com:8080

        当源A的网页试图通过XMLHttpRequest或Fetch API向源B发送请求时,浏览器会执行以下步骤:

        (1)浏览器发送一个请求到源B,这个请求可能是一个简单请求(如GET、POST且没有自定义头)或者是非简单请求(如PUT、DELETE或带有自定义头)。

        (2)对于非简单请求,浏览器会先发送一个预检请求(OPTIONS方法)到源B,以确定源B是否允许跨域请求。

        (3)服务器源B必须响应预检请求,并在响应头中包含允许跨域的相关头信息(如Access-Control-Allow-Origin、Access-Control-Allow-Methods等)。

        (4)如果预检请求通过,浏览器才会发送实际的请求。

        浏览器会自动处理预检请求和实际请求,但服务器必须能够响应预检请求,即对OPTIONS请求返回正确的CORS头。

        对于简单请求,浏览器不会发送预检请求,但服务器仍然需要返回CORS头(如Access-Control-Allow-Origin)以允许跨域。

        下面是一个简单的例子,说明响应头中需要包含:

Access-Control-Allow-Origin: http://www.example.com // 或者使用 * 表示允许任何域Access-Control-Allow-Methods: GET, POST, PUTAccess-Control-Allow-Headers: Content-Type

        这样,浏览器就会允许跨域请求。

        注意:跨域限制是浏览器行为,服务器之间的通信没有跨域限制。跨域的本质是浏览器的安全限制,不是HTTP协议的限制。服务器之间的HTTP请求没有跨域问题,只有浏览器中的JavaScript受此限制。

        简单说,就是浏览器前端JavaScript在请求资源或者请求后端服务,且不同源时,才会出现跨域

2.前端VUE与后端分离,不同端口,为何不存在跨域呢?

        实际上,在开发阶段,前端VUE使用不同的端口访问后端接口时,是存在跨域问题的。但是,VUE的开发服务器(dev server)提供了一个代理功能,可以解决跨域问题。

        我们通过配置代理(proxy)将前端的请求转发到后端,从而避免了跨域。因为浏览器直接发送请求给前端的开发服务器,然后由开发服务器转发给后端,而服务器之间的请求没有跨域限制。

Vue CLI 代理配置 (vue.config.js)module.exports = {devServer: {proxy: {'/api': {target: 'http://localhost:3000', // 后端地址changeOrigin: true,pathRewrite: {'^/api': '' // 重写路径}}}}
}

        在Nginx配置反向代理,

server {listen 80;server_name example.com;# 前端静态文件location / {root /var/www/vue-dist;index index.html;}# 代理API请求到后端location /api/ {proxy_pass http://localhost:3000/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

        其最终实际通信流程就不存在跨域了,因为转发后的端口和IP对浏览器端是无感知的,返回给浏览器端的还是:example.com端口80

3.如何解决跨域?

        主要有三种方案:

方案A:同域部署(推荐)

用户访问:https://www.example.com↓
前端静态文件:https://www.example.com↓
API接口:https://www.example.com/api↓
Nginx反向代理 → 后端服务

        其Nginx配置文件如下:

server {listen 443 ssl;server_name www.example.com;# 前端静态资源location / {root /usr/share/nginx/html;index index.html;try_files $uri $uri/ /index.html;}# API代理location /api/ {proxy_pass http://backend-service:8080/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

方案BCORS配置

        修改后端代码,允许跨域:

// 后端配置允许特定域名
app.use(cors({origin: ['https://www.example.com', 'https://admin.example.com'],credentials: true
}));

方案C:网关层统一处理

浏览器 → API网关(统一域名) → 各个微服务↓CORS统一处理

4.为什么Postman能请求成功?

        跨域仅仅是浏览器安全策略所致!!!

        跨域仅仅是浏览器安全策略所致!!!

        跨域仅仅是浏览器安全策略所致!!!

        Postman:桌面应用,不受同源策略限制,浏览器:有安全沙箱,受同源策略保护。

5.后端添加CORS配置,但前端还是报跨域,如何排查?

        其主要排查步骤如下:

        1.检查响应头是否生效

// 在浏览器开发者工具查看响应头
Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization

        2.检查预检请求处理

// 确保OPTIONS方法被正确处理
app.options('*', cors()); // 处理所有OPTIONS请求

        3.检查缓存问题

# 清除浏览器缓存或使用无痕模式
# 重启开发服务器

        4.检查路径匹配

// 确保CORS中间件在路由之前
app.use(cors());
app.use('/api', apiRoutes); // CORS要在路由前
调试技巧:
javascript
// 添加调试中间件
app.use((req, res, next) => {console.log('请求头:', req.headers);console.log('请求方法:', req.method);next();
});

http://www.dtcms.com/a/470637.html

相关文章:

  • 中企动力做的网站经常打不开怎么做网页设计稿
  • c 手机网站开发做电商一个月可以赚多少钱
  • openFuyao v25.09 版本正式发布!社区发行版全新升级,AI推理进一步优化
  • 世界标准日:关于 “标准”
  • 从671B到70B,如何用更低成本实现企业大模型工程化的RAG、Agent与微调落地,大模型入门到精通,收藏这篇就足够了!
  • 给网站添加关键词流行的wordpress主题
  • 深入理解epoll_data数据关联机制:四种方式详解与实践指南
  • m3u8格式在直播场景中的应用
  • 医疗门户网站管理系统在线营销推广
  • 积分非线性(INL)和微分非线性(DNL)的含义与联系
  • JavaSE面向对象(上)
  • 光的礼赞:探索自然界中的神奇之光
  • 一个企业网站的建设流程微信小程序商城收费吗
  • C++核心语法精要指南
  • 网站中弹出广告怎么做的腾讯官方网站做书签
  • 国外优秀的设计网站公司要做seo
  • 丰台体育馆网站建设WordPress批量修改文章
  • 计算机操作系统:进程同步
  • 怎么制作网站封面建设网站的视频
  • 为什么做网站要有自己的服务器做网站自己租服务器还是网络公司
  • DeepSeek vs ChatGPT 技术架构、成本与场景全解析
  • java开发三层架构下的分层解耦
  • 缔客网络上海响应式网站建设如何建平台网站
  • 学习Java第三十七天——黑马点评61~68
  • 网站 运营 外包 每个月多少钱h5制作易企秀
  • 基础算法:滑动窗口
  • 数据比例与尺度:如何避免让图“放大”差异
  • 《动手学深度学习v2》学习笔记 | 3.4-3.7 softmax 回归
  • Python驱动的无人机多光谱-点云融合技术在生态三维建模与碳储量、生物量、LULC估算中的全流程实战
  • 哪些网站收录排名好wordpress 获取title