如何解决Ollama跨域问题:OPTIONS预检请求与CORS配置终极指南 🚀

【免费下载链接】ollama Get up and running with Llama 2 and other large language models locally 【免费下载链接】ollama 项目地址: https://gitcode.com/gh_mirrors/ol/ollama

Ollama是一款能让你在本地快速部署和运行Llama 2等大型语言模型的强大工具。本文将深入解析Ollama中的跨域资源共享(CORS)机制,帮助开发者轻松解决API调用中的跨域问题,确保本地LLM服务与前端应用无缝协作。

为什么Ollama会出现跨域错误?🤔

当你的前端应用(如Web界面、桌面应用)尝试调用Ollama API时,浏览器的同源策略可能会阻止请求,导致控制台出现类似Access-Control-Allow-Origin的错误。这是因为:

  • Ollama服务默认运行在localhost:11434
  • 前端应用可能托管在不同端口或域名
  • 现代浏览器会对跨域请求进行严格检查

Ollama通过预检请求(OPTIONS方法)和CORS头信息来解决这个问题,相关配置位于核心路由文件server/routes.go中。

Ollama的CORS配置解析 🔍

Ollama使用Gin框架的CORS中间件实现跨域支持,关键配置如下:

corsConfig := cors.DefaultConfig()
corsConfig.AllowWildcard = true
corsConfig.AllowBrowserExtensions = true
corsConfig.AllowHeaders = []string{
    "Authorization",
    "Content-Type",
    "User-Agent",
    // 支持OpenAI兼容性 headers
    "OpenAI-Beta",
    "x-stainless-*",
}
corsConfig.AllowOrigins = envconfig.AllowedOrigins()

这个配置允许: ✅ 通配符域名访问 ✅ 浏览器扩展调用API ✅ 多种认证和内容类型头 ✅ 自定义的OpenAI兼容头

3种快速解决Ollama跨域问题的方法 💡

方法1:使用默认配置(推荐新手)

Ollama默认已经启用CORS支持,大多数情况下无需额外配置。只需确保:

  1. 前端请求头包含Content-Type: application/json
  2. 不要修改server/routes.go中的CORS设置
  3. 通过ollama serve命令启动服务

方法2:自定义允许的域名

如果需要指定允许的前端域名,可以通过环境变量配置:

OLLAMA_ALLOW_ORIGINS=https://your-frontend-app.com ollama serve

多个域名用逗号分隔:

OLLAMA_ALLOW_ORIGINS=https://app1.com,https://app2.com ollama serve

方法3:修改源码配置(高级用户)

编辑server/routes.go文件,修改CORS配置:

// 将第1415行修改为
corsConfig.AllowOrigins = []string{"https://your-domain.com"}
// 或允许所有域名(开发环境)
corsConfig.AllowAllOrigins = true

修改后需要重新编译Ollama:

go build -o ollama main.go

常见跨域错误及解决方案 ❌→✅

错误1:No 'Access-Control-Allow-Origin' header

解决方案: 检查OLLAMA_ALLOW_ORIGINS环境变量是否包含前端域名,或在server/routes.go中设置AllowAllOrigins: true

错误2:Request header field authorization is not allowed

解决方案: 确保请求头包含在允许列表中,Ollama默认已包含"Authorization"头,相关代码在server/routes.go#L1394

错误3:Preflight response is not successful

解决方案: 这通常是OPTIONS预检请求失败,检查Ollama服务是否正常运行,网络是否能访问localhost:11434

Ollama API调用示例代码 🚀

JavaScript fetch示例

fetch('http://localhost:11434/api/generate', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'User-Agent': 'My-Ollama-App'
  },
  body: JSON.stringify({
    model: 'llama2',
    prompt: '为什么天空是蓝色的?'
  })
})
.then(response => response.json())
.then(data => console.log(data.response));

Python请求示例

import requests

url = "http://localhost:11434/api/generate"
headers = {"Content-Type": "application/json"}
data = {
    "model": "llama2",
    "prompt": "解释什么是CORS"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())

高级配置:使用环境变量自定义CORS

Ollama通过envconfig包支持动态配置CORS,常用环境变量:

环境变量 说明 示例
OLLAMA_ALLOW_ORIGINS 允许的源域名 https://app.example.com
OLLAMA_HOST 绑定的IP地址 0.0.0.0(允许外部访问)
OLLAMA_PORT 服务端口 11434

总结:Ollama跨域问题排查流程图 📊

  1. 检查浏览器控制台错误信息
  2. 确认请求头是否符合要求
  3. 检查OLLAMA_ALLOW_ORIGINS配置
  4. 查看server/routes.go中的CORS设置
  5. 尝试重启Ollama服务

通过以上步骤,你应该能顺利解决Ollama的跨域问题,让本地LLM服务与前端应用无缝协作。如果需要更深入的API使用指南,可以参考官方文档docs/api.md

祝你的Ollama开发之旅顺利!如有其他问题,欢迎在项目GitHub仓库提交issue。

【免费下载链接】ollama Get up and running with Llama 2 and other large language models locally 【免费下载链接】ollama 项目地址: https://gitcode.com/gh_mirrors/ol/ollama

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐