win7本地php跨域只需在脚本开头加5行header并处理options请求:必须确保header()在任何输出前执行、禁用bom、动态匹配origin、显式响应options预检,否则浏览器因端口不同(如localhost:8080→localhost:80)直接拦截。

Win7 上本地测试 PHP 接口时遇到跨域问题,根本不用动前端、也不用装 nginx 或配代理——直接在 PHP 脚本开头加几行 header() 就能跑通,但必须满足两个硬条件:输出不能提前、OPTIONS 请求得单独处理。
为什么 localhost:8080 访问 localhost:80 会跨域
协议、域名、端口三者任一不同即跨域。哪怕都是 localhost,只要端口不一样(比如前端开在 http://localhost:8080,PHP 接口跑在 http://localhost:80 或集成环境的 :8081),浏览器就拦你。这不是 PHP 报错,是控制台里清清楚楚写着:Access to XMLHttpRequest at 'http://localhost:8081/api.php' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
PHP 文件开头必须加这 5 行 header
别写在 echo 后面,别写在 print 后面,别包含任何空格或 BOM 字符——所有 header() 必须在脚本第一行可执行逻辑之前。
-
header('Access-Control-Allow-Origin: http://localhost:8080');—— 生产环境必须写死域名,开发阶段可以先这么写;别用*配带凭证的请求(比如要传 Cookie) -
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');—— 前端发什么方法,这里就得列什么 -
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');—— 前端如果手动设了Content-Type: application/json或加了Authorization头,这里不声明就会卡在预检 -
header('Access-Control-Allow-Credentials: true');—— 只有需要读写 Cookie 或带认证头时才加;加了这句,Access-Control-Allow-Origin就不能是* -
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit(); }—— 浏览器发预检请求(OPTIONS)时,PHP 必须立刻返回 200 并终止,否则后续业务逻辑会执行两次
phpstudy/XAMPP 环境下常见踩坑点
Win7 用户大概率用的是 phpstudy 或 XAMPP,这两个环境默认开启 output_buffering,但依然挡不住“页面顶部有空行”或“UTF-8 BOM”导致 header() 失效。
- 用 Notepad++ 打开 PHP 文件 → 编码菜单 → 选“转为 UTF-8 无 BOM 格式”
- 检查文件开头有没有空行、
<?php前有没有空格或不可见字符 - 别在
header()前做任何echo、var_dump、print_r,哪怕只是调试用也不行 - phpstudy 的“网站根目录”里如果放了
index.html,又通过浏览器直接打开这个 HTML(file:// 协议),那根本不是跨域,是浏览器禁止 AJAX 读取本地文件——必须用http://协议访问(比如http://localhost/test.html)
测试是否生效的最快方式
别等前端改完再试,用最简 PHP 脚本验证:
<?php header('Access-Control-Allow-Origin: http://localhost:8080');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
header('Access-Control-Allow-Credentials: true');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit();
}
echo json_encode(['status' => 'ok', 'data' => 'from php']);
?>
保存为 api.php,用浏览器访问 http://localhost/api.php 看是否返回 JSON;再用前端代码发起带 credentials: 'include' 的 fetch,看控制台有没有跨域报错。没报错,说明头设置对了;报错但提示 has credentials 相关,说明 Access-Control-Allow-Origin 还写了 *;报错说 preflight 失败,八成是 OPTIONS 没拦截住或者 Allow-Headers 漏了字段。
Win7 系统本身不干预 HTTP 头,真正卡人的永远是输出顺序、BOM、和预检逻辑这三处——调通之后,接口就能本地稳稳跑起来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











