PHP 如何做跨域

在前端开发中,你可能遇到过这样的情况:本地写好的网页,想调用另一个域名的接口,浏览器却弹出“跨域请求被阻止”的错误,整个功能直接失效。其实跨域就像生活里的“串门限制”——你住A小区,不能随便进B小区的门,除非B小区保安(服务器)主动放行。PHP作为常用的后端语言,处理跨域的方式很简单,今天就用生活化的例子拆解清楚。

先搞懂:跨域到底是啥?

跨域的核心是浏览器的“同源策略”——简单说,只要协议(http/https)、域名(比如a.com)、端口(80/8080)这三个有一个不一样,就是不同的“域”,浏览器会阻止不同域之间的资源请求,防止恶意网站偷数据。

PHP 如何做跨域

举个例子:你在本地用localhost:8080的前端页面,想调用服务端api.test.com的登录接口,这俩域名、端口都不一样,自然触发跨域。就像你家前门(localhost:8080)要进对面超市的后门(api.test.com),没超市老板(服务端)允许,保安(浏览器)肯定不让进。

最常用的PHP跨域方案:CORS(简单版)

大部分场景用CORS就够了,这是现在最主流的跨域处理方式,相当于超市老板主动在后门贴了“欢迎A小区(指定域名)的朋友进”的告示,保安(浏览器)看到就放行。

PHP实现这个方案,只需要在服务端接口的最开头,加上几句简单的响应头代码就行。比如你要做一个用户信息接口,服务端代码里先加这几行:

`php

// 允许的域名,这里可以写死,也可以从配置里拿,比如只允许你的前端域名http://localhost:8080

header("Access-Control-Allow-Origin: http://localhost:8080");

// 允许的请求方法,比如GET、POST、PUT,常用的就写这几个

header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");

// 允许带的请求头,比如前端传的token字段

header("Access-Control-Allow-Headers: Content-Type, Authorization");

`

这么加完,前端再调用接口,浏览器就不会拦了。要是你想让多个域名都能访问,也可以改得灵活点——先判断前端的来源域名,符合的就给它放行权限,比如:

`php

// 允许的域名列表,多个用逗号分隔

$allowOrigins = ['http://localhost:8080', 'https://你的正式前端域名.com'];

// 获取当前请求的来源域名

$origin = $_SERVER['HTTP_ORIGIN'] ?? '';

// 如果来源在允许列表里,就给权限

if (in_array($origin, $allowOrigins)) {

header("Access-Control-Allow-Origin: $origin");

}

`

就像超市老板说“只认A小区和我的合作商铺,其他不让进”,灵活又安全。

特殊情况:复杂请求的处理

刚才说的是简单请求,要是你请求带了特殊内容,比如传JSON格式的POST数据(Content-Type是application/json),浏览器会先发一个“试探请求”(OPTIONS请求),相当于你先敲超市后门,问“我能进吗”,老板得先回应这个试探,再放行正式请求。

这时候PHP得加个判断,处理OPTIONS请求,比如在接口开头加:

`php

// 如果是OPTIONS试探请求,直接返回200成功,不用处理业务

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

http_response_code(200);

exit;

}

`

这么一来,浏览器的试探请求得到回应,就会继续发正式的GET/POST请求,不会卡住。

避坑提醒

很多新手会犯的错:把跨域的代码写在前端里,或者写在静态资源的服务器配置里(比如Nginx),其实跨域的责任在服务端,得在PHP接口的响应头里加,就像你要进超市,得跟超市老板说,不能跟小区保安说。另外,正式上线别把Access-Control-Allow-Origin设为*(通配符),这相当于超市大门随便进,会有安全风险,只放你自己的前端域名就好。

其实PHP处理跨域就是这么简单,核心就是给服务端接口加对应的响应头,让浏览器知道“这个请求是合法的”。下次再遇到跨域错误,别慌,先检查服务端的响应头有没有加对,按上面的步骤改,基本都能解决。

上一篇 TypeScript this 类型怎么用