php跨域问题本质是浏览器同源策略拦截响应,解决关键是php返回时设置合法cors响应头并正确处理options预检请求;可通过脚本header()、nginx配置或框架中间件实现,生产环境须动态校验origin、禁用*配合credentials。

PHP搭建API接口时遇到跨域问题,本质不是PHP拦了请求,而是浏览器出于安全限制,阻止了前端发来的跨域响应。解决核心是让PHP在返回数据时,附带合法的CORS响应头,并正确应对OPTIONS预检请求。
手动在PHP脚本中加响应头
适合调试或轻量项目,灵活性高,但要注意执行时机:
- 所有
header()调用必须在任何输出之前(包括空格、BOM、echo、var_dump);否则报“headers already sent”错误 - 开发阶段可先写:
header("Access-Control-Allow-Origin: *");header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With"); - 生产环境禁用
*配合凭据:若前端设credentials: 'include',则Access-Control-Allow-Origin必须精确匹配来源域名,不能为* - 务必单独处理OPTIONS请求,在业务逻辑最开头加:
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { exit(0); }
动态校验Origin更安全
不硬编码域名,避免多前端环境适配难、白名单维护混乱:
- 定义允许的源数组,例如:
$allowed = ['https://admin.example.com', 'https://app.example.com', 'http://localhost:5173']; - 读取真实请求来源:
$origin = $_SERVER['HTTP_ORIGIN'] ?? ''; - 校验并设置响应头:
if (in_array($origin, $allowed)) {<br> header("Access-Control-Allow-Origin: $origin");<br> header('Vary: Origin'); // 告知CDN按Origin缓存不同版本<br> } - 如需支持Cookie或Token,再加:
header("Access-Control-Allow-Credentials: true");
注意:此时Access-Control-Allow-Origin必须是具体域名,且前端fetch要显式写credentials: 'include'
用Nginx统一配置CORS(推荐生产环境)
把规则下沉到Web服务器层,减少PHP代码侵入,利于统一管理和性能优化:
- 在Nginx的
location /api/块内添加:add_header 'Access-Control-Allow-Origin' '$http_origin' always;<br> add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;<br> add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;<br> add_header 'Access-Control-Allow-Credentials' 'true' always;<br> add_header 'Vary' 'Origin' always;
- 显式拦截并响应OPTIONS请求:
if ($request_method = 'OPTIONS') {<br> add_header 'Access-Control-Allow-Origin' '$http_origin';<br> add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';<br> add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With';<br> add_header 'Access-Control-Allow-Credentials' 'true';<br> add_header 'Access-Control-Max-Age' 86400;<br> add_header 'Content-Length' 0;<br> add_header 'Content-Type' 'text/plain; charset=utf-8';<br> return 204;<br> }
ThinkPHP等框架用中间件管理CORS
避免散落在各控制器里,提升可维护性:
- 安装官方扩展:
composer require think-cors - 在
app/middleware.php中注册:[\think\middleware\Cors::class] - 配置
config/cors.php,明确填写白名单:'origin' => ['http://localhost:8080', 'https://your-fe.com'],<br> 'allow_credentials' => true,<br> 'allow_methods' => ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],<br> 'allow_headers' => ['Content-Type', 'Authorization', 'X-Requested-With']
- 该方式自动处理OPTIONS、兼容withCredentials、支持Vary头,比手写更健壮
跨域不是PHP的问题,而是前后端通信时浏览器强加的安全边界。只要响应头合规、预检不遗漏、Origin不滥用通配符,问题就能稳定解决。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











