phpEnv跨域配置本质是修改Nginx站点配置中location块的add_header指令,必须加always参数并重启Nginx生效;错误根源常为改错配置文件位置、未在server/location块内设置、或*与credentials冲突。

phpEnv 是 Windows 下集成 PHP + Nginx + MySQL 的轻量环境,它的跨域配置本质就是修改其内置 Nginx 的配置文件——但很多人改了没生效,根本原因是没搞清 add_header 的作用范围和 phpEnv 的配置层级。
确认 phpEnv 使用的是哪个 Nginx 配置文件
phpEnv 默认把 Nginx 配置分散在多个位置,主配置通常不在 /conf/nginx.conf,而是在站点专属配置里。常见路径有:
-
C:\phpEnv\nginx\conf\sites-enabled\default.conf(最常用) -
C:\phpEnv\nginx\conf\sites-enabled\yourproject.conf(如果你建过自定义站点) - 极少数版本会把规则写进
C:\phpEnv\nginx\conf\nginx.conf的http块里,但不推荐
别直接改 nginx.conf 全局文件——它只控制 worker 和 mime 类型,跨域头必须加在 server 或 location 块里才生效。
在 location 块里用 add_header 设置 CORS 头
phpEnv 的默认站点配置中,location / 通常已包含 try_files 和 PHP fastcgi 转发。你要在这里补上跨域响应头,且必须带 always 参数(否则 301/302 或错误页会丢失这些头):
立即学习“PHP免费学习笔记(深入)”;
location / {
try_files $uri $uri/ /index.php?$query_string;
<pre class='brush:php;toolbar:false;'># 跨域响应头(关键:加 always)
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;
add_header 'Access-Control-Expose-Headers' 'Content-Disposition' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
# 处理预检请求
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
# PHP 处理逻辑(保持原有内容不变)
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}}
注意几个易错点:
-
Access-Control-Allow-Origin设为*时,Access-Control-Allow-Credentials必须删掉或设为false,否则浏览器直接拒绝 - 如果前端要带 Cookie,就必须指定具体源,比如
add_header 'Access-Control-Allow-Origin' 'http://localhost:8080' always -
add_header在if块里也必须加always,否则 OPTIONS 返回的 204 响应不会携带这些头
重启 phpEnv 的 Nginx 服务才能生效
phpEnv 界面右下角托盘图标 → 右键 → “Restart Nginx” 或 “Reload Nginx”。仅点击“Start”不会重载配置。
验证是否生效:
- 用 curl 检查响应头:
curl -I http://localhost/api/test,看是否有Access-Control-Allow-Origin - 打开浏览器开发者工具 → Network → 点开一个接口 → 查看 Response Headers
- 如果看到
Access-Control-Allow-Origin但仍是跨域报错,大概率是前端发的是带凭证(credentials: 'include')的请求,而 Nginx 返回的 Origin 是*—— 这对不上,必须改成具体域名
最常被忽略的一点:phpEnv 的 Nginx 默认启用 gzip,而某些旧版 Nginx(如 1.4.x)在开启 gzip 时,add_header 在 304 或错误响应中会被丢弃——所以务必始终加上 always,别省略。



















