PHP 跨域解决方案是什么?一篇把常见跨域问题彻底讲清楚

30 阅读3分钟

很多人第一次做 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️⃣ 用 localhost127.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 跨域的正确姿势

这两个,也是被问得最多、最容易翻车的点。