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

关于Django项目的浏览器跨域问题

问题描述:

我的Django框架运行在服务器上,前端vue框架运行在我自己的主机上。前端启动时直接使用了localhost,未标注完全ip。

在配置好前端和后端并运行后,前端请求不到后段api。出现以下报错:

The Cross-Origin-Opener-Policy header has been ignored, because the URL's origin was untrustworthy. It was defined either in the final response or a redirect. Please deliver the response using the HTTPS protocol. You can also use the 'localhost' origin instead. See https://www.w3.org/TR/powerful-features/#potentially-trustworthy-origin and https://html.spec.whatwg.org/#the-cross-origin-opener-policy-header.

请求信息:AxiosError {message: 'Network Error', name: 'AxiosError', code: 'ERR_NETWORK', config: {…}, request: XMLHttpRequest, …}

思考

这段报错实际上应该出自浏览器的拦截机制。

核心原理:浏览器的"可信源"概念

现代浏览器(Chrome 80+)引入了Secure Contexts(安全上下文)概念,要求跨域通信必须发生在"可信"的源之间。

1.什么被认为是"可信源"?

根据W3C标准,浏览器信任以下几类源:

  • localhost127.0.0.1(仅限于自身)

  • HTTPS协议的站点

  • 本地文件(file://协议)

  • 特定的保留域名(*.localhost等)

根据可信源的理念,我的前端应该是绝对可信的。并且我的主机ip使用ping命令可以ping通,但是请求不到api。

我一开始认为是我的后端ip不是可信源所以不行,实际上确实是这样。

INSTALLED_APPS = [

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'corsheaders',

'myapps',

]

MIDDLEWARE = [

'django.middleware.security.SecurityMiddleware',

'corsheaders.middleware.CorsMiddleware',

'django.contrib.sessions.middleware.SessionMiddleware',

'django.middleware.common.CommonMiddleware',

'django.middleware.csrf.CsrfViewMiddleware',

'django.contrib.auth.middleware.AuthenticationMiddleware',

'django.contrib.messages.middleware.MessageMiddleware',

'django.middleware.clickjacking.XFrameOptionsMiddleware',

]

ROOT_URLCONF = 'ExperimentalAPI.urls'

# CORS settings for frontend

CORS_ALLOWED_ORIGINS = [

"http://localhost:3000",

"http://127.0.0.1:3000",

"http://localhost:5173",

"http://127.0.0.1:5173",

"http://172.31.71.51:8080",

"http://172.31.10.43:5173",

]

CORS_ALLOW_CREDENTIALS = True

CORS_ALLOW_ALL_ORIGINS = True

CSRF_TRUSTED_ORIGINS = [

"http://localhost:3000",

"http://127.0.0.1:3000",

"http://localhost:5173",

"http://127.0.0.1:5173",

"http://172.31.71.51:8080",

"http://172.31.10.43:5173",

]

CORS_ALLOW_HEADERS = [

"accept",

"accept-encoding",

"authorization",

"content-type",

"dnt",

"origin",

"user-agent",

"x-csrftoken",

"x-requested-with",

"content-disposition", # 文件上传可能需要这个

]

按照ai的提示,在项目的setting.py中添加了相关的中间件,问题还是存在。

查阅资料之后,发现解决方法非常简单,只需要在前端启动时,指定启动host就可以了。

指令如下:

npm.cmd run dev -- --host 172.31.10.43

结论

问题解决了,但是我还是有疑问,询问ai:
步骤3:修改前端访问方式 不要用 http://localhost:5173,改用: http://127.0.0.1:5173 或 http://172.31.10.43:5173(你的前端IP) 按照你说的,我在setting文件中配置好中间件后将前端服务启动为npm run dev -- --host 172.31.10.43,问题解决了。这个操作是什么原理,可以详细讲讲吗

回答:

2.问题根源分析

你原来的配置:

text

前端: http://localhost:5173 后端: http://172.31.71.51:8080

这里的问题是:

  • 前端是localhost(可信)

  • 后端是172.31.71.51(不可信,因为是非localhost的HTTP)

  • 混合了可信和不可信的源→ 浏览器拒绝

3.你的解决方案为什么有效?

方案A:前端使用 127.0.0.1

text

前端: http://127.0.0.1:5173 (仍然可信) 后端: http://172.31.71.51:8080 (不可信)

为什么这个能工作?因为127.0.0.1虽然是可信源,但浏览器对其有特殊处理,不像localhost那么严格。

方案B:前端使用 172.31.10.43

text

前端: http://172.31.10.43:5173 (不可信) 后端: http://172.31.71.51:8080 (不可信)

这个方案是"用魔法打败魔法"

  • 两个都是不可信源(HTTP + 非localhost IP)

  • 浏览器对两个不可信源之间的通信限制较少

  • 形成了"同病相怜"的跨域场景

各种方案的对比分析

方案前端源后端源可信状态跨域策略结果
原方案localhost172.31.71.51可信↔不可信COOP严格❌ 失败
方案A127.0.0.1172.31.71.51半可信↔不可信较宽松✅ 有时成功
你的方案172.31.10.43172.31.71.51不可信↔不可信最宽松成功
HTTPS方案https://...https://...可信↔可信标准✅ 最好

核心思想:浏览器对localhost的安全检查最严格,对普通HTTP IP地址的检查相对宽松。通过让前端也使用普通IP地址(而不是localhost),你避开了浏览器最严格的跨源安全检查,使得两个"不可信"源之间的通信得以进行。

这是一个典型的"开发环境hack",在生产环境中,应该使用HTTPS + 域名 + 适当的CORS配置。

http://www.jsqmd.com/news/304491/

相关文章:

  • 9999999999999
  • 家政老板必读:避开小程序开发四大坑,打造高效赚钱的家政系统
  • JDK版本的区别
  • 嵌入式系统设计师软考个人笔记<3>
  • ADC相关
  • 目标检测数据集 - 野生动物检测数据集下载
  • 老年人评估项目开发记录3
  • 1.26假期记录
  • 2026年 铆接设备/铆接机厂家推荐排行榜:精选高效稳定铆接解决方案,助力精密制造升级
  • Claude Code Python 技能完整目录 - 2,847个顶级开发工具 - nano
  • 99999999999
  • =========
  • Sealos 私有化:离线环境部署踩坑实录
  • 2024年AI原生应用开源数据集推荐:高质量训练数据获取+处理全攻略
  • 别再问了,Sealos 私有化部署就这几步
  • 导师推荐!继续教育AI论文写作软件TOP9:9款测评帮你高效完成毕业论文
  • 2026年 铆钉机厂家推荐排行榜,双头铆钉机,气动铆钉机,全自动铆钉机,对敲铆钉设备,子母钉机,高效精准铆接设备源头精选
  • 大模型术语全解析:从LLM到Agent,小白必学指南
  • MCP:大模型界的Type-C标准,让你的工具一次编写到处运行(深度好文,值得收藏)
  • Ollama大模型开发实战:从基础到高级功能的全面指南
  • 从入门到精通:RAG生产级实战指南 | 大模型应用必备收藏
  • 大模型开发工程师年薪90万不是梦!零基础入门到高薪就业的完整攻略(附资料包)
  • Java毕设项目:基于springboot的机器人健康预警系统(源码+文档,讲解、调试运行,定制等)
  • 银源电力联系方式:企业信息查询与使用建议
  • 2026最新K歌电视品牌top5推荐!家庭娱乐影音设备企业及厂家权威榜单发布,沉浸式K歌体验
  • 【课程设计/毕业设计】基于JAVA+Vue+SpringBoot的个人健康管理系统健康档案、体检档案、健康咨询基于springboot的个人健康管理系统【附源码、数据库、万字文档】
  • 蓝凌软件联系方式:官方路径与背景介绍
  • Java计算机毕设之基于Springboot+MySQ基于springboot的个人健康管理系统基于SpringBoot + Vue的个人运动健康管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 【毕业设计】基于springboot的机器人健康预警系统(源码+文档+远程调试,全bao定制等)
  • 我的 OI 故事(二):世上本没有路