TinkerLab
DIAGNOSTIC TREE // CORS-PROXY-LAN-403 (3 ROOT CAUSES)

浏览器插件/局域网前端调用本地模型报 403 CORS 拒绝或反代 502

排查浏览器插件(Page Assist / 沉浸式翻译)或局域网 Web 前端调用 11434 报 403 Forbidden、CORS 拦截或混合内容阻断。

[核心实测结论 / TL;DR]本诊断树针对「浏览器插件/局域网前端调用本地模型报 403 CORS 拒绝或反代 502」提供 4 个交互节点与 3 套实测验证修复方案(涵盖:修复方案:配置 OLLAMA_ORIGINS 放行浏览器扩展与前端域名;修复方案:在 Nginx / Caddy 反向代理中重写 Host 请求头;修复方案:使用 Caddy / Tailscale 启用 HTTPS 或改为后端转发),配套完整实测指南《cors-reverse-proxy-auth-local-llm》。
浏览器插件/局域网前端调用本地模型报 403 CORS 拒绝或反代 502
第 1 步:浏览器开发者工具(Network 面板)中显示什么具体错误?

复现报错请求,或在终端用下方带 Origin 头的 curl 命令模拟浏览器跨域请求。

终端验证命令 (在对应环境执行)
curl -i -X OPTIONS http://127.0.0.1:11434/api/tags -H "Origin: chrome-extension://test" -H "Access-Control-Request-Method: POST"

若返回 HTTP/1.1 403 Forbidden,说明被 Ollama 内置的 Origin 跨域白名单直接拦截。

选择你看到的实际输出或症状:
DIAGNOSTIC PROBE SEQUENCE // 完整分步探测命令与症状分支

「浏览器插件/局域网前端调用本地模型报 403 CORS 拒绝或反代 502」的全部 1 步终端探测命令与分支判据

无需逐层点击交互,以下列出本故障决策树每一层的宿主机只读探测命令、预期基线提示与输出流向。

第 1 步:浏览器开发者工具(Network 面板)中显示什么具体错误?step-cors-status

复现报错请求,或在终端用下方带 Origin 头的 curl 命令模拟浏览器跨域请求。

curl -i -X OPTIONS http://127.0.0.1:11434/api/tags -H "Origin: chrome-extension://test" -H "Access-Control-Request-Method: POST"

若返回 HTTP/1.1 403 Forbidden,说明被 Ollama 内置的 Origin 跨域白名单直接拦截。

输出症状分支:
  • • 返回 HTTP 403 Forbidden(OPTIONS 预检或 POST 被拒)→ sol-ollama-origins-env
  • • 直连正常,但经过 Nginx / Caddy 反向代理后报 403 或 502→ sol-proxy-host-header-rewrite
  • • 请求未发出即被浏览器拦截(Mixed Content:HTTPS 网页调用 HTTP 局域网 IP)→ sol-mixed-content-https
ALL VERIFIED FIXES IN THIS TREE // 本树涵盖的全部根因与修复方案一览

「浏览器插件/局域网前端调用本地模型报 403 CORS 拒绝或反代 502」包含的 3 类根因、修复代码与验收命令

修复方案:配置 OLLAMA_ORIGINS 放行浏览器扩展与前端域名

sol-ollama-origins-env

为防止恶意网页通过跨域探测本机模型,Ollama 默认拒绝带有非 localhost Origin 头的请求(包括 `chrome-extension://`、`moz-extension://` 与局域网前端)。

  1. 设置环境变量 OLLAMA_ORIGINS="chrome-extension://*,moz-extension://*,http://192.168.*"(优先按协议最小范围放行)。
  2. 重启 Ollama 服务,重新执行带 Origin 头的探测命令确认返回 200/204。
# macOS (launchctl)
launchctl setenv OLLAMA_ORIGINS "chrome-extension://*,moz-extension://*,http://localhost:*"

# Linux systemd override (/etc/systemd/system/ollama.service.d/override.conf)
[Service]
Environment="OLLAMA_ORIGINS=chrome-extension://*,moz-extension://*,http://192.168.*"

[边界说明]安全警告:切勿在未加鉴权代理的情况下同时开启 OLLAMA_HOST=0.0.0.0 与 OLLAMA_ORIGINS=*,否则你浏览的任意公网网页都能偷调本机模型。

验证命令: curl -i -X OPTIONS http://127.0.0.1:11434/api/tags -H "Origin: chrome-extension://test" -H "Access-Control-Request-Method: POST"

修复方案:在 Nginx / Caddy 反向代理中重写 Host 请求头

sol-proxy-host-header-rewrite

新版 Ollama 为防范 DNS 重绑定攻击会校验 HTTP Host 头。若反向代理透传了自定义域名(如 Host: ai.homelab.local),Ollama 会直接拒绝并返回 403。

  1. 保持宿主机 Ollama 仅监听 127.0.0.1:11434。
  2. 在 Nginx 配置中添加 `proxy_set_header Host localhost:11434;`(或在 Caddy 中配置 `header_up Host localhost:11434`)。
location / {
    proxy_pass http://127.0.0.1:11434;
    proxy_set_header Host localhost:11434;
    proxy_buffering off;
    proxy_read_timeout 300s;
}

[边界说明]建议配合 Nginx 的 Authorization Bearer 校验使用,兼顾兼容性与局域网鉴权安全。

验证命令: curl -i http://127.0.0.1:11434/api/version -H "Host: localhost:11434"

修复方案:使用 Caddy / Tailscale 启用 HTTPS 或改为后端转发

sol-mixed-content-https

现代浏览器实施严格的混合内容(Mixed Content)与私有网络访问限制:HTTPS 站点无法直接向明文 HTTP 局域网 IP(如 http://192.168.1.50:11434)发起请求。

  1. 若使用 Open WebUI / LobeChat 等应用,请在服务端环境变量中配置 Ollama 地址(走服务端代理转发),而非开启“浏览器直接请求”模式。
  2. 或者通过 Caddy 自签证书 / Tailscale HTTPS 为局域网节点提供加密端点。
# Caddyfile with automatic local TLS & Host rewrite
https://ollama.homelab.internal {
    tls internal
    reverse_proxy 127.0.0.1:11434 {
        header_up Host localhost:11434
        flush_interval -1
    }
}

[边界说明]浏览器将本机 `http://127.0.0.1` 视为安全上下文放行,但任何 `http://192.168.x.x` 局域网地址在 HTTPS 页面下都会被无条件拦截。

验证命令: caddy validate --config Caddyfile
PAIRED REPRODUCIBLE GUIDE // 配套实测指南与硬件环境基线

本地模型 403 CORS 跨域拒绝、Nginx/Caddy 反代报错与局域网鉴权排障指南

彻底解决浏览器插件(Page Assist / 沉浸式翻译)或局域网前端调用 11434 报 HTTP 403 Forbidden、反向代理 DNS 重绑定拦截与 HTTPS 混合内容阻断。

实测硬件与系统

Nginx 1.26 / Caddy 2.8 · Ollama 0.5.7 · 浏览器扩展与局域网多端调用实测

锁定版本栈

Ollama 0.5.7 · Nginx 1.26+ · Caddy 2.8+

验证日期 (2026-10-23)

100% 局域网受控鉴权网关 — 让 Ollama 原生进程严格保持在 127.0.0.1 回环地址,通过反向代理层向局域网提供强制 Bearer 密钥校验的安全接口。