关于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.mzph.cn/news/1220690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

家政老板必读:避开小程序开发四大坑,打造高效赚钱的家政系统

引言:家政行业的数字化转型之痛 “钱花了,功能却报废了”——这是许多家政老板在尝试数字化转型后的真实心声。花费数万元甚至更多资金开发的小程序,上线后却发现派单卡顿如PPT,预约系统形同虚设,客户流失率不降反升。…

JDK版本的区别

在IDEA中新建Spring Boot项目时,需要选择JDK版本,这里小记一下: Oracle OpenJDK Oracle 官方维护的开源免费JDK,Java标准实现。 Amazon Corretto 亚马逊基于 OpenJDK 定制的免费、长期支持JDK。 JetBrains Runtime JetBrains&…

嵌入式系统设计师软考个人笔记<3>

1.1 嵌入式系统电源管理1.1.1 电源系统基础定义:为嵌入式设备提供稳定、合规直流电能的子系统,通常将交流市电或电池电源转换为系统所需的直流电压等级。供电类型:市电供电:通过AC-DC转换模块(如开关电源)提…

ADC相关

1.简述 IIC 的读时序 主机发送起始信号(S):SDA 从高变低,SCL 保持高电平;主机发送7 位 / 10 位从机地址 读位(R1),SCL 同步时钟,从机接收后返回ACK 应答(SD…

目标检测数据集 - 野生动物检测数据集下载

数据集介绍:野生动物检测数据集,真实场景高质量图片数据,涉及场景丰富,比如旱季水源地聚集、迁徙通道穿越、灌丛遮蔽行走、野生动物遮挡、野生动物严重遮挡数据等,且类别丰富,划分为 "buffalo"、…

老年人评估项目开发记录3

今天把之前的反向计算评估分数改成了正向计算评估分数,后面打算开始开发app

2026年 铆接设备/铆接机厂家推荐排行榜:精选高效稳定铆接解决方案,助力精密制造升级

2026年铆接设备/铆接机厂家推荐排行榜:精选高效稳定铆接解决方案,助力精密制造升级 在现代制造业的精密装配环节中,铆接工艺扮演着至关重要的角色。从汽车零部件、消费电子到包装制品、家居建材,高效、稳定且精密的…

Claude Code Python 技能完整目录 - 2,847个顶级开发工具 - nano

这是 最全面的 Claude Code Python 技能目录,Agent – Claude Code skills 精选导航站精选 2,847个 经过 GitHub 社区验证(累计 3,500,000+ Stars)的 Python 开发工具,涵盖 Web 开发、数据科学、机器学习、自动化脚本…

Sealos 私有化:离线环境部署踩坑实录

说个可能得罪人的话:Sealos 私有化部署,真没大家吹得那么"开箱即用"。我最近帮几个客户做离线环境部署,踩的坑比预想的多。今天不聊成功案例,专门聊聊那些"官方文档不会告诉你"的风险点。离线镜像同步是个无底…

2024年AI原生应用开源数据集推荐:高质量训练数据获取+处理全攻略

2024 年 AI 原生应用开源数据集推荐:高质量训练数据获取 处理全攻略 摘要/引言 在当今 AI 蓬勃发展的时代,高质量的数据集对于训练出强大且精准的 AI 原生应用至关重要。然而,如何获取合适的开源数据集,并对其进行有效的处理&a…

别再问了,Sealos 私有化部署就这几步

最近被问私有化部署的问题快问麻了,干脆写一篇彻底说清楚。顺便拉几个"老朋友"出来比比,你们自己看哪个更适合。先说说市面上都有谁私有化部署云平台这条赛道,玩家其实不少:Rancher、KubeSphere、OpenShift。每个都说自…

导师推荐!继续教育AI论文写作软件TOP9:9款测评帮你高效完成毕业论文

导师推荐!继续教育AI论文写作软件TOP9:9款测评帮你高效完成毕业论文 2026年继续教育AI论文写作工具测评:为何值得一看 随着继续教育的不断发展,越来越多的学习者面临毕业论文写作的压力。从选题构思到文献检索,再到内…

2026年 铆钉机厂家推荐排行榜,双头铆钉机,气动铆钉机,全自动铆钉机,对敲铆钉设备,子母钉机,高效精准铆接设备源头精选

2026年铆钉机厂家推荐排行榜:高效精准铆接设备源头精选 在现代制造业的精密装配与自动化升级浪潮中,铆接技术作为连接工艺的核心环节,其设备性能直接决定了产品的质量、生产效率与成本控制。从包装、家电、汽车零部…

大模型术语全解析:从LLM到Agent,小白必学指南

文章系统介绍了大模型领域的核心术语,包括LLM(参数规模≥1B的语言模型)、MCP(连接外部数据的标准化协议)、Agent(结合LLM和工具实现任务的智能体)、RAG(减少模型幻觉的检索增强生成)、LangChain(开发框架)、vLLM(通过KV Cache和连续批处理提高效率)等关键技术概念&a…

MCP:大模型界的Type-C标准,让你的工具一次编写到处运行(深度好文,值得收藏)

文章介绍了MCP(模型上下文协议)作为大模型界的"Type-C"标准,解决了不同模型间工具不通用的问题。通过MCP,开发者可以创建统一格式的工具接口,使大模型能够执行绘画、搜索、文件操作等传统代码能力&#xff0…

Ollama大模型开发实战:从基础到高级功能的全面指南

本文全面介绍了Ollama大模型平台的核心功能与开发技巧,包括流式处理三种模式、CLI命令使用、Pydantic定义JSON结构、向量嵌入应用、Agent多轮工具调用以及Web Search API集成。通过丰富代码示例和最佳实践指导,帮助开发者掌握从基础到高级的Ollama应用开…