ollama_origins 作用搞混了?跨域请求被拦多半在这

模型与算力

讲清 ollama_origins 这个环境变量到底管什么、什么时候必须配、配错会出什么现象,给出可照着做的排查顺序。

很多人给 Ollama 配了局域网访问,浏览器里打开网页版却一直报跨域错误,控制台一行 CORS 提示,回头翻文档才发现还有个 ollama_origins。这篇就从这个卡点讲起:它管的是浏览器来的请求,不管命令行和脚本;什么场景要配、值该怎么写、配完怎么验证,一步步来。

不少人把 Ollama 开到局域网,想着浏览器里打开个网页版就能用,结果面板一打开全是红的,控制台飘一行跨域提示。回头翻文档,才发现还有个 ollama_origins 没动过。这个变量的位置很尴尬:说它是网络配置吧,它不影响端口通不通;说它是安全设置吧,它又拦不住谁。搞清楚它到底拦的是谁,后面就顺了。

先说结论:它管的是浏览器发来的请求,不管你的 curl、Python 脚本或者后端服务。所以终端里测得好好的,网页一调就挂,八成就是这一层的事。下面按「它拦什么、什么场景要配、值怎么填、配完怎么验」的顺序讲,中间穿插几个容易填错的格子。

它拦的是浏览器,不是你的 curl

ollama_origins 是 Ollama 服务读的一个环境变量,作用是声明哪些网页来源被允许跨域调用接口。关键词是「网页来源」。浏览器在发跨域请求前会带上 Origin 头,服务端拿这个头跟允许列表比对,不在列表里就放行失败,浏览器控制台就会报 CORS 相关的错。而你直接在终端敲 curl,压根没有 Origin 这一层,所以同一个服务,命令行能通、网页不能通,是很常见的组合。

还有个默认行为要记住:不配这个变量时,服务只放行本机来源。所以外部页面调那个监听端口,被挡下来是预期内的,不代表服务没起。判断要不要动它,只看一件事——报错出现在浏览器开发者工具里,还是在终端里。终端报连接拒绝那是端口和监听地址的问题,跟这个变量没关系,别在这上面浪费时间。

现象大概率原因先查哪里
终端 curl 正常,网页请求报 CORS来源没被允许ollama_origins 的当前值
终端 curl 也连不上服务没起或监听地址不对服务状态、监听地址
换台机器浏览器打不开,本机能开监听只绑了本机回环启动参数里的监听地址
配了变量还是报同样的错没重启或值写错重启服务、逐字符对值

这几种情况才真需要配

不是所有跨机器访问都要动它。真正需要的场景,基本都跟「浏览器直接打 Ollama 接口」有关。比如你自己写了个纯前端的聊天页面,用 fetch 直连服务;或者把 Open WebUI、Chatbox 这类界面跑在另一个端口、另一台机器上,并且绕开了它自带的后端转发,让浏览器直接连过去;再比如内网里同事用浏览器开你机器的服务地址,前端页面和服务地址不同源。这几种都躲不开来源校验。

反过来,下面这些情况配了也白配,甚至把暴露面搞大:后端服务统一转发请求(浏览器只跟你的后端说话)、页面和服务在同一台机器同一端口、只在本机终端里用。尤其是中间那类「有反代或后端中转」的架构,跨域这层根本不经过浏览器,问题多半出在反代配置或者请求路径上,往 ollama_origins 上找会走偏。

  • 浏览器前端 fetch 直连 Ollama 接口——要配
  • 界面跑在别的端口或别的机器且直连——要配
  • 内网同事浏览器访问你的服务地址——要配
  • 后端统一转发、浏览器不直连——不用配
  • 同机同端口的页面——不用配
  • 只在本机终端里跑脚本——不用配

配的时候容易填错的那一格

这个值最容易错的地方,是把它当成 IP 或者域名来写。它要的是完整来源,协议、主机、端口都得带上,而且要跟浏览器地址栏里看到的那个来源一模一样。只写个 IP,或者随手加个结尾斜杠,都会对不上。多个来源之间按官方要求的分隔方式写,别拿空格凑,也别图省事直接写通配符。

改完必须重启服务才生效。Linux 下如果是用 service 管理的,改 service 文件里的环境变量再重启;临时测试可以在启动命令前带上变量。Windows 下改的是系统环境变量,改完要把终端整个关掉重开,不然读到的还是旧值。这一步漏掉,就会出现「明明配了却没反应」的假象。

  1. 先确认服务本身通不通在服务所在机器上 curl 一下接口,返回正常说明监听没问题,问题在浏览器那一侧。
  2. 看浏览器的 Origin 头打开开发者工具,找到那条失败的请求,看请求头里的 Origin 具体是什么值,一个字一个字跟配置对。
  3. 核对配置值确认协议、主机、端口齐全,没有结尾斜杠,多个来源分隔方式正确。
  4. 重启并复测重启服务,硬刷新页面再发一次请求,看控制台报错是否消失。

它不是鉴权,别指望拿它当安全开关

这点得说透。放行某个来源,只是告诉浏览器「这个页面可以调我」,不等于限制谁能访问接口。Ollama 接口本身没有身份校验,谁摸到地址谁就能用。把服务暴露到公网,再配个宽松的来源列表,等于门开着还贴了张「欢迎光临」。真要防护,得落在网络层:只监听内网地址、前面加个带鉴权的反向代理、别把端口直接映射出去。

还有一种常见误判:为了省事把来源写成通配符,觉得「反正内网」。实际效果是任何网页都能从访问者的浏览器里打你的服务,风险比不配还大。改完不确定暴露面多大,可以顺着监听地址、端口映射、反代规则过一遍。想知道自己当前这套配置在中转和直连之间处于什么位置,也可以到站内的工具目录对照着看,别凭感觉。

ollama_origins 决定的是浏览器肯不肯替你发这个请求,不是谁有资格用你的服务。
下一步把来源、监听地址、端口映射三件事对着过一遍,再决定要不要放开;站内的检测工具和导航页能帮你判断当前这套配置的暴露面。

常见问题

配了 ollama_origins 浏览器还是报跨域,先查什么?

先确认服务是不是真重启了,旧进程还挂着的话新值没生效。再看报错里的来源和你填的值是否完全一致,协议、端口、有没有 www 都算不同源。最后确认请求到底是打到 Ollama 还是打到了前面的反向代理,代理那层也会拦。

本地脚本调用正常,网页却失败,是 ollama_origins 的问题吗?

大概率是。脚本和 curl 不走浏览器的同源策略,服务能通就说明模型和端口没问题。浏览器这边多了一道来源校验,所以现象是终端正常、页面报错,这一类先往环境变量和反向代理配置上找。

不配这个变量,只把监听改成对外,会怎样?

服务能被访问到,但浏览器页面调接口时仍会被拦,表现为网络面板里有请求、控制台报跨域。同时把监听开大却不做任何限制,等于把没有鉴权的接口摊在网络上,风险比跨域报错大得多。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。