news 2026/3/3 5:16:04

关于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/3/2 4:03:24

CRLF与LF的行分隔符警告⚠️

在IDEA开发环境中,点击提交出现以下警告: CR:Carriage Return(回车)LF:Line Feed(换行) 因为在Windows 系统中默认使用 CRLF(回车换行)作为一行的结束&…

作者头像 李华
网站建设 2026/2/28 7:21:15

攻击者绕过SSO安全防护攻击FortiGate防火墙

FortiGate防火墙正遭受静默攻击,攻击者已找到绕过单点登录(SSO)保护的方法,能够直接从设备中窃取敏感配置信息。根据网络安全公司Arctic Wolf发布的安全警告,自1月15日开始,该公司发现了一波针对Fortinet F…

作者头像 李华
网站建设 2026/2/28 12:49:16

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

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

作者头像 李华
网站建设 2026/2/27 14:40:22

提示工程架构中的意图识别优化

提示工程架构中的意图识别优化:让AI真正“听懂”用户的话 一、引入:当AI变成“听不懂话的服务员” 清晨的咖啡馆里,你对服务员说:“我要一杯热的,不加糖。” 服务员立刻回应:“好的,热美式不加…

作者头像 李华
网站建设 2026/3/1 21:02:22

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

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

作者头像 李华
网站建设 2026/3/1 22:53:53

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

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

作者头像 李华