配置 Ollama 的 CORS
为本地请求配置 OLLAMA_ORIGINS
要正确处理来自本地应用程序和浏览器的请求,需要配置 OLLAMA_ORIGINS 环境变量,该变量定义允许的 Origin 请求头值。
设置环境变量
环境变量必须在启动 Ollama 服务之前设置。如果 Ollama 已在运行,则必须在设置变量后重新启动它。
Linux (systemd 服务)
大多数 Linux 安装将 Ollama 作为 systemd 服务运行。要配置环境变量:
sudo systemctl edit ollama
添加以下内容:
[Service]
Environment="OLLAMA_ORIGINS=http://*,https://*,onlyoffice://*"
应用更改:
sudo systemctl daemon-reload
sudo systemctl restart ollama
验证变量是否已设置:
systemctl show ollama --property=Environment
Linux (手动启动)
如果不使用 systemd 手动运行 Ollama:
export OLLAMA_ORIGINS=http://*,https://*,onlyoffice://*
ollama serve
macOS
Ollama 在 macOS 上作为独立应用程序运行。有几种设置环境变量的方法:
方法一:使用 launchctl (推荐)
launchctl setenv OLLAMA_ORIGINS "http://*,https://*,onlyoffice://*"
设置变量后,退出并重新启动 Ollama 应用程序。
方法二:添加到 shell 配置文件
添加到 ~/.zshrc 或 ~/.bash_profile:
export OLLAMA_ORIGINS=http://*,https://*,onlyoffice://*
然后从新的终端会话重新启动 Ollama 应用程序。
Windows
PowerShell (仅当前会话):
$env:OLLAMA_ORIGINS = "http://*,https://*,onlyoffice://*"
ollama serve
PowerShell (永久设置,需要新会话):
setx OLLAMA_ORIGINS "http://*,https://*,onlyoffice://*"
使用 setx 后,关闭并重新打开 PowerShell,然后启动 Ollama。
Docker
docker run -d \
-e OLLAMA_ORIGINS="http://*,https://*,onlyoffice://*" \
-p 11434:11434 \
-v ollama:/root/.ollama \
ollama/ollama
值说明
http://*- 允许来自任何 HTTP 域的请求https://*- 允许来自任何 HTTPS 域的请求onlyoffice://*- 允许来自 ONLYOFFICE 嵌入式 WebView 的请求 (用于 AI 插件功能)
验证 CORS 配置
配置环境变量并启动 Ollama 后,可以验证服务器响应中是否存在 CORS 头:
curl -v -X OPTIONS http://localhost:11434/api/tags \
-H "Origin: http://localhost:3000" \
-H "Access-Control-Request-Method: GET"
预期响应应包含以下头信息:
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true
使用 GET 请求的替代验证方法:
curl -v http://localhost:11434/api/tags \
-H "Origin: http://localhost:3000"
响应应包含与指定 Origin 匹配的 Access-Control-Allow-Origin 头。
使用场景
- ONLYOFFICE 桌面版配合 AI 插件
- 不同端口/主机上的本地 Web 应用程序
- 与 Ollama API 交互的 Electron/React 应用程序
安全建议
使用通配符值 (*) 会开放来自所有域的 API 访问,不建议在公共服务器上使用。对于生产环境,请指定明确的域:
OLLAMA_ORIGINS=http://localhost:3000,https://ollama.example.com
为通过 SSL 的网络请求配置 OLLAMA_ORIGINS
要通过 HTTPS 协议接受来自网络上其他计算机的请求,需要以下配置。
网络接口配置
这些环境变量必须在启动 Ollama 服务之前设置。
默认情况下,Ollama 仅监听 localhost。要启用网络访问,请指定:
Linux (systemd)
sudo systemctl edit ollama
[Service]
Environment="OLLAMA_ORIGINS=http://*,https://*,onlyoffice://*"
Environment="OLLAMA_HOST=0.0.0.0"
sudo systemctl daemon-reload
sudo systemctl restart ollama
Linux (手动) / macOS
export OLLAMA_HOST=0.0.0.0
export OLLAMA_PORT=11434
Docker
docker run -d \
-e OLLAMA_ORIGINS="https://*" \
-e OLLAMA_HOST="0.0.0.0" \
-p 11434:11434 \
-v ollama:/root/.ollama \
ollama/ollama
此配置会将 API 暴露给整个网络。必须采取额外的安全措施 (反向代理、身份验证)。
配置允许的 SSL 来源
OLLAMA_ORIGINS 变量必须在启动 Ollama 服务之前设置。
对于从其他域/服务器上的 Web 界面访问,例如 https://ollama-ui.my.local:
export OLLAMA_ORIGINS=https://ollama-ui.my.local,https://ui.example.org
使用通配符的替代方法:
export OLLAMA_ORIGINS=https://*
启动服务
ollama serve
或使用显式参数:
ollama serve --host 0.0.0.0 --port 11434
重要安全说明
在没有额外保护的情况下通过公共 IP/HTTPS 直接访问 Ollama 存在重大安全风险。建议使用带有 TLS 终止和身份验证机制的反向代理。
Nginx 作为 HTTPS 反向代理的配置
此配置通过 Nginx 提供对 Ollama API 的安全 HTTPS 访问,并支持 CORS。
要求
- 已安装 Nginx
- 有效的 SSL 证书 (Let's Encrypt 或其他 CA)
- 运行在 11434 端口的 Ollama 实例
基本 Nginx 配置
# 将 HTTP 重定向到 HTTPS
server {
listen 80;
server_name ollama.example.com;
return 301 https://$host$request_uri;
}
# 主 HTTPS 服务器
server {
listen 443 ssl;
server_name ollama.example.com;
ssl_certificate /etc/letsencrypt/live/ollama.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ollama.example.com/privkey.pem;
# SSL 设置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
# 处理预检 OPTIONS 请求
if ($request_method = OPTIONS) {
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Headers' 'Authorization,Origin,Accept,Content-Type' always;
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS' always;
return 204;
}
location / {
proxy_pass http://localhost:11434;
# CORS 头 (always 标志确保为所有响应代码添加头)
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Headers' 'Authorization,Origin,Accept,Content-Type' always;
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS' always;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 和流式传输支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 增加长时间运行操作的超时时间
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
# 禁用流式响应的缓冲
proxy_buffering off;
}
}
通过 HTTP 基本身份验证提供额外保护
要限制 API 访问:
location / {
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.ollama_passwd;
proxy_pass http://localhost:11434;
# CORS 头
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Headers' 'Authorization,Origin,Accept,Content-Type' always;
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS' always;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
proxy_buffering off;
}
要创建密码文件,请使用 htpasswd 工具:
sudo htpasswd -c /etc/nginx/.ollama_passwd admin
测试 Nginx 配置
在重新加载 Nginx 之前,始终测试配置:
sudo nginx -t
sudo systemctl reload nginx
关键配置方面
- 带有
always标志的 CORS 头对于正确处理来自 ONLYOFFICE 和其他浏览器客户端的跨域请求是必需的。always标志确保即使对于错误响应 (4xx、5xx) 也添加头。 proxy_read_timeout参数增加到 300 秒,以处理语言模型的长时间运行操作,这些操作可能需要大量时间来生成响应。- SSL/TLS 加密确保网络 API 访问期间的流量保护。
- WebSocket 支持对于模型实时流式响应功能的正常工作是必要的。
- 禁用缓冲 (
proxy_buffering off) 允许流式响应立即发送到客户端。
故障排除
环境变量已设置但 CORS 不起作用
**症状:**您设置了 OLLAMA_ORIGINS,但请求仍然因 CORS 错误而失败。
**解决方案:**设置环境变量后必须重新启动 Ollama 服务。
对于 systemd:
sudo systemctl restart ollama
对于 Docker:
docker restart <container_name>
对于 macOS 应用:退出并重新启动应用程序。
CORS 在 curl 中有效但在浏览器中无效
症状:curl 请求成功,但浏览器请求失败。
可能的原因:
- 浏览器发送的
Origin头与允许的来源不匹配 - 浏览器正在缓存之前失败的 CORS 响应
解决方案:
- 检查浏览器开发者工具 (网络选项卡) 以查看正在发送的确切
Origin - 清除浏览器缓存或在隐身模式下测试
- 确保您的
OLLAMA_ORIGINS包含确切的来源 (协议 + 域 + 端口)
如何检查当前环境变量
Linux (systemd):
systemctl show ollama --property=Environment
Linux (运行中的进程):
cat /proc/$(pgrep ollama)/environ | tr '\0' '\n' | grep OLLAMA
Docker:
docker inspect <container_name> | grep -A 10 "Env"
端口 11434 上的连接被拒绝
**症状:**无法从另一台计算机连接到 Ollama。
解决方案:
- 确保设置了
OLLAMA_HOST=0.0.0.0(不仅仅是 localhost) - 检查防火墙规则:
sudo ufw allow 11434/tcp - 验证 Ollama 是否在所有接口上监听:
ss -tlnp | grep 11434
Nginx 返回 502 Bad Gateway
**症状:**Nginx 已配置但返回 502 错误。
解决方案:
- 验证 Ollama 是否正在运行:
systemctl status ollama - 检查 Ollama 是否可在本地访问:
curl http://localhost:11434/api/tags - 检查 Nginx 错误日志:
tail -f /var/log/nginx/error.log - 确保 SELinux 没有阻止连接 (在 RHEL/CentOS 上):
sudo setsebool -P httpd_can_network_connect 1
流式响应不起作用
**症状:**响应一次性到达而不是流式传输。
解决方案:
- 在 Nginx location 块中添加
proxy_buffering off; - 确保配置了 WebSocket 头:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
解决方案架构
┌─────────────────┐ HTTPS ┌─────────────────┐ HTTP ┌─────────────────┐
│ ONLYOFFICE │ ──────────────── │ Nginx │ ───────────── │ Ollama │
│ (浏览器/ │ :443 │ (反向代理 │ :11434 │ (LLM API) │
│ 桌面版) │ │ + TLS + CORS) │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
组件交互遵循以下方案:
- ONLYOFFICE UI 通过 HTTPS 协议连接到 Nginx
- Nginx 作为带有 CORS 处理的反向代理,将请求转发到 11434 端口上的本地 Ollama 实例
- Nginx 提供 TLS 终止和访问控制
OLLAMA_ORIGINS变量控制允许的请求来源- ONLYOFFICE AI 插件使用安全的 HTTPS 端点连接到语言模型