PHP 7.4 本身不拦截跨域请求,真正报错的是浏览器;需在 PHP 脚本开头设置 Access-Control-Allow-Origin 等 CORS 响应头,并在 REQUEST_METHOD 为 OPTIONS 时返回 204 状态码以正确处理预检请求。

PHP 7.4 本身不产生跨域错误,真正报错的是浏览器——它在 PHP 返回响应前,就因同源策略拦截了前端发向 http://localhost:11434(Ollama 默认地址)的请求。所以问题本质是:你的 PHP 脚本作为“中间层”调用 Ollama API 时,前端又去请求这个 PHP 脚本,结果 PHP 返回的内容没带正确 CORS 头,导致浏览器拒绝把响应交给前端 JS。
确认调用链和问题定位
先理清实际路径:
- 前端(如 Vue 页面)→ 请求你的 PHP 接口(例如
/api/chat.php) - PHP 7.4 脚本 → 用 cURL 或 file_get_contents 请求
http://localhost:11434/api/chat - 浏览器看到 PHP 返回的响应头里没有
Access-Control-Allow-Origin→ 报 CORS 错误
也就是说,不是 PHP 访问 Ollama 出错,而是你用 PHP 代理 Ollama 后,没给自己的响应加跨域头。
PHP 7.4 脚本必须加的响应头
在 PHP 文件最开头(任何 echo、print、HTML 输出或空白符之前)加入:
立即学习“PHP免费学习笔记(深入)”;
header('Access-Control-Allow-Origin: https://your-frontend-domain.com');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
注意:
- 如果前端用了
credentials: 'include'(比如传 Cookie),Access-Control-Allow-Origin就不能写*,必须填具体域名 - 如果不确定前端域名,开发阶段可临时写
http://localhost:3000或http://127.0.0.1:5173等常见本地地址 - 确保这些
header()在session_start()、ob_start()或任何输出前执行
必须处理 OPTIONS 预检请求
前端若发的是 JSON 请求(Content-Type: application/json)或带自定义 Header,浏览器会先发一个 OPTIONS 请求。PHP 必须响应它,否则后续请求根本不会发出:
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(204);
exit;
}
这段代码要放在所有 header() 之后、业务逻辑之前。204 状态码比 200 更规范,表示“无内容”,且不触发浏览器缓存问题。
检查 Ollama 侧是否需额外配置
虽然 PHP 是代理方,但 Ollama 自身的 CORS 设置也会影响调试:
- Ollama 默认已启用宽松 CORS(允许
*、支持浏览器扩展等) - 如果你在 PHP 中用 cURL 调 Ollama,PHP 不受浏览器同源策略限制,无需 Ollama 开 CORS——但你要确保 cURL 没被防火墙或代理阻断
- 运行
OLLAMA_ALLOW_ORIGINS=http://localhost:3000 ollama serve可显式限定来源,方便与前端直连调试(非必须,仅作对照)



















