nginx跨域配置核心是通过add_header注入cors响应头,而非修改php代码;需在location块中添加access-control-allow-origin等头部并加always参数,对options预检请求单独return 204,支持带cookie时须指定具体源并启用access-control-allow-credentials。

在 Windows 上用 Nginx 1.31.6 搭配 PHP 7.4.33 实现跨域访问,核心不是改 PHP,而是让 Nginx 在响应头中正确注入 CORS 字段。只要 Nginx 配置到位,PHP 不用动一行代码,浏览器就能放行跨域请求。
定位并修改对应站点的 Nginx 配置文件
如果你用的是 phpstudy 或手动部署的 Nginx,配置文件位置略有不同:
- phpstudy 用户:打开 phpstudy 安装目录 → Extensions → nginx → conf → vhosts,找到你当前访问的域名(如
localhost2.conf或test.local.conf) - 纯 Nginx 用户:直接编辑 nginx/conf/nginx.conf,或在
http{}块内引入自定义配置(如include vhost/*.conf;),再新建对应文件
在 location 块中添加标准跨域响应头
把以下配置粘贴进你要开放跨域的 location 块内部(比如 location /api/ { ... } 或 location / { ... }):
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' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization' always;
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' 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;
}
注意:always 参数必须加上,否则 Nginx 默认不给 3xx/4xx/5xx 响应加 header;if 块仅用于拦截预检请求,不参与真实业务转发。
支持带 Cookie 的跨域(登录态必需)
如果前端请求需携带 cookie(例如 credentials: 'include'),则必须满足两个条件:
-
Access-Control-Allow-Origin不能写*,要指定具体前端域名,例如:add_header 'Access-Control-Allow-Origin' 'https://admin.example.com' always; - 额外开启凭据支持:
add_header 'Access-Control-Allow-Credentials' 'true' always;
同时确保前端 fetch 请求中设置了 credentials: 'include',且后端 PHP 不要再重复输出 CORS 头(避免冲突)。
重载配置并验证生效
保存配置后,在 Nginx 根目录下运行命令重载:
nginx -s reload
若提示失败,可用 nginx -t 检查语法;若端口被占(如报错 10013),用 netstat -ano | findstr :80 查 PID,再 taskkill /F /PID xxx 结束占用进程。
验证方式:用浏览器打开前端页面,调用接口后,在开发者工具 Network 标签页点开响应,查看 Response Headers 中是否包含 Access-Control-Allow-Origin 等字段 —— 有即成功。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











