很多人第一次做 PHP 接口,都会遇到一个非常“玄学”的问题:
Postman、curl 请求一切正常,
只要一到浏览器,立刻报跨域。
然后开始疯狂搜索:
- php 跨域解决方案是什么
- php 跨域解决方案怎么写
- php 跨域问题解决
- php 设置跨域访问
- phpstudy 跨域
结果是:
看了十几篇文章,问题还在。
这篇文章,我不绕概念,只讲你在真实项目里会遇到的跨域问题。
一、php 跨域解决方案是什么?先说一个真相
PHP 本身不存在跨域限制。
真正限制你的是——浏览器的同源策略。
也就是说:
- PHP 接口能不能被访问 ✔
- 浏览器允不允许 JS 调这个接口 ❌
是两回事。
所以你会看到一个非常常见的现象:
curl 能调
Postman 能调
浏览器 ajax 调不了
👉 这不是 PHP 写错,而是你没告诉浏览器:这个接口允许跨域。
二、php 跨域问题到底在解决什么?
简单说一句人话:
php 跨域解决方案 = 给浏览器一个“放行证明”
这个“证明”,就是 HTTP Header。
最常见的就是:
header("Access-Control-Allow-Origin: *");
但如果你以为加了这一句就万事大吉,那基本一定会踩坑。
三、php 跨域解决方案怎么写?先从最基础的说
1️⃣ 最基础的 php 设置跨域访问
适合 不带登录态、不带 cookie 的接口:
<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type");
echo json_encode(['msg' => 'ok']);
这种写法,只适合最简单的接口测试。
⚠️ 不建议直接用在生产环境
四、php 跨域请求解决方案里,90% 的坑在这里
❌ 错误 1:跨域 + Cookie 一起用 *
很多人写成这样:
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
这是错误写法,浏览器会直接拒绝。
✅ 正确方式是:指定域名
header("Access-Control-Allow-Origin: https://www.example.com");
header("Access-Control-Allow-Credentials: true");
❌ 错误 2:OPTIONS 预检请求没处理
只要你满足以下任意一个条件:
- 使用 POST / PUT
- 自定义 Header
- 携带 Cookie
浏览器就会先发一个 OPTIONS 预检请求。
如果 PHP 没处理,浏览器直接拦截。
五、phpstudy 跨域,为什么特别容易翻车?
这是新手最容易踩的坑之一。
常见原因有 3 个:
1️⃣ 端口不同也算跨域
2️⃣ 用 localhost 和 127.0.0.1 混着调
3️⃣ Apache 没开 mod_headers
建议做法:
- 用 phpstudy 配虚拟域名
- 统一协议 + 域名 + 端口
- Header 一定写在 任何输出之前
六、很多人误解的几个“伪跨域”
这里顺便说清几个高频搜索词:
👉 php curl 跨域
不存在。
curl 是服务器行为,不受浏览器同源策略影响。
如果 curl 报错,那是接口问题,不是跨域。
👉 php ajax 跨域
这是真正的跨域问题,
因为 ajax 是跑在浏览器里的。
解决方案只有一个:
👉 正确设置 CORS Header
七、为什么网上教程都看不懂?
因为大多数文章:
- 只讲一个场景
- 不讲 session / cookie
- 不讲 phpstudy
- 不讲 OPTIONS
- 不讲为什么错
而真实项目里,跨域往往是多个问题叠在一起的。
跨域问题,靠记不住,靠对照
如果你现在:
- 正在被 php 跨域问题卡住
- 已经试了好几种写法
- 不知道是 Header、Session 还是环境问题
那你需要的不是再看一篇“解释文章”,
而是一套 按场景拆好的、可直接用的代码对照。
我已经把 CORS / AJAX / Session / phpstudy / 常见错误
整理成了一个完整的 PHP 跨域解决方案代码包。
需要的话,可以去我 CSDN 资源区看看。
PHP 跨域不难,难的是你不知道自己卡在哪一步。
下一篇我会继续拆:
👉 php session 跨域为什么总是失效?
👉 php cors 跨域的正确姿势
这两个,也是被问得最多、最容易翻车的点。