news 2026/4/16 14:48:32

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
关于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配置。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 17:28:44

Java虚拟机内存模型解析与内存管理问题

引言在Java开发中,内存管理和虚拟机内存模型是至关重要的内容,直接关系到应用的稳定性和性能。本篇博客将详细探讨Java虚拟机内存模型的相关问题,涵盖引用类型、内存泄漏、内存溢出等关键概念,并提供实际的解决方案。一、引用类型…

作者头像 李华
网站建设 2026/4/16 13:04:35

学长亲荐2026 MBA必备AI论文软件TOP10:开题报告文献综述全解析

学长亲荐2026 MBA必备AI论文软件TOP10:开题报告文献综述全解析 2026年MBA论文写作工具测评:精准匹配学术需求 在MBA学习过程中,论文写作是贯穿始终的核心环节,从开题报告到文献综述,再到最终的论文撰写,每一…

作者头像 李华
网站建设 2026/4/16 12:05:27

导师推荐!专科生必看9款AI论文软件测评,开题报告神器TOP9

导师推荐!专科生必看9款AI论文软件测评,开题报告神器TOP9 2026年专科生论文写作工具测评:选对工具,效率翻倍 随着AI技术在学术领域的不断渗透,越来越多的专科生开始依赖AI论文软件提升写作效率。然而,面对…

作者头像 李华
网站建设 2026/4/11 14:00:35

javascript:void怎么解决

1.首先打开IE浏览器,找到菜单栏工具。 2 工具菜单中单击Internet选项。 3 在常规选项卡中单击删除按钮,删除cookies和历史文件。 4 然后单击安全选项卡,选择默认级别。 5 切换到隐私选项卡单击高级按钮。 6 勾选覆盖cookie自动处理&…

作者头像 李华