server_name 必须精确匹配 Host 头,不支持通配符模糊匹配,需用正则实现泛域名;大小写敏感,多域名空格分隔;配置后须 nginx -t && nginx -s reload 生效。

phpEnv 中 Nginx 的 server_name 必须精确匹配域名
phpEnv 默认用 Nginx 做前端代理,请求能否按域名分发,核心就看 server_name 指令是否写对。它不支持通配符模糊匹配(比如 *.example.com 需额外加 ~^.*\.example\.com$ 正则写法),也不自动继承系统 hosts 或 DNS 设置。
常见错误现象:curl -H "Host: api.example.com" 127.0.0.1 返回默认站点、浏览器访问 admin.example.com 却打开 www.example.com 的页面——基本都是 server_name 拼错、漏写、或大小写不一致(Nginx 区分大小写)。
- 多个域名共用一个站点:写成
server_name example.com www.example.com; - 需要泛解析子域:必须用正则,例如
server_name ~^([a-z0-9\-]+)\.example\.com$;,并确保root或fastcgi_param SCRIPT_FILENAME能动态处理$1 - 本地开发常用
localhost和自定义域名混用时,server_name要同时列出,如server_name localhost test.dev www.test.dev;
phpEnv 的站点配置文件路径和重载方式
phpEnv 把每个站点的 Nginx 配置单独存放在 C:\phpEnv\nginx\vhost\(Windows)或 /usr/local/phpenv/nginx/vhost/(Linux/macOS),文件名通常为 yourdomain.conf。改完后不能靠重启 phpEnv GUI 生效,必须手动重载 Nginx。
容易踩的坑:改了配置但没 reload,或者 reload 失败却没看日志,误以为配置无效。
立即学习“PHP免费学习笔记(深入)”;
- Windows 下进 phpEnv 安装目录,运行
nginx -t测试语法,再运行nginx -s reload - Linux/macOS 下常用
sudo /usr/local/phpenv/nginx/sbin/nginx -t && sudo /usr/local/phpenv/nginx/sbin/nginx -s reload - 如果报
bind() to 0.0.0.0:80 failed (98: Address already in use),说明端口被占用,先查netstat -ano | findstr :80(Win)或lsof -i :80(macOS/Linux)
fastcgi_pass 必须指向 phpEnv 管理的 PHP-FPM 实例
即使 server_name 对了、Nginx 也 reload 成功,如果 fastcgi_pass 指向错误的 socket 或端口,请求仍会 502。phpEnv 默认为每个 PHP 版本启动独立的 FPM 进程,socket 文件路径类似 /usr/local/phpenv/php/8.2/var/run/php-fpm.sock(Linux/macOS)或 C:\phpEnv\php\8.2\var\run\php-fpm.sock(Windows)。
典型问题:复制网上教程的 fastcgi_pass 127.0.0.1:9000,但 phpEnv 默认用 Unix socket,不是 TCP 端口;或者用了 8.1 的 socket 却在 8.2 的站点里引用。
- 确认当前站点用哪个 PHP 版本:看 phpEnv GUI 界面或配置文件中
include的 PHP 版本路径 - Unix socket 写法:
fastcgi_pass unix:/usr/local/phpenv/php/8.2/var/run/php-fpm.sock; - TCP 方式需手动在对应 PHP 版本的
php-fpm.conf里启用listen = 127.0.0.1:9001,并保证端口不冲突
Hosts 文件和浏览器缓存是调试阶段最大干扰源
本地测试时,test.dev 能否正确路由,一半问题出在系统层而非 Nginx。Windows 的 C:\Windows\System32\drivers\etc\hosts 或 macOS/Linux 的 /etc/hosts 必须把域名映射到 127.0.0.1,且不能有空格、中文注释或重复条目。
更隐蔽的问题是浏览器缓存了旧的 HSTS 策略或 301 重定向,导致你改了配置、清了 Nginx 缓存,但浏览器仍固执地跳转到另一个域名。
- 验证 hosts 是否生效:命令行执行
ping test.dev,应返回127.0.0.1 - 绕过浏览器缓存调试:用
curl -v http://test.dev查看实际响应头和状态码;或 Chrome 无痕窗口 + 强制刷新(Ctrl+F5) - 如果曾开启过 HTTPS 并设置过 HSTS,临时改用非标准端口(如
http://test.dev:8080)可彻底规避



















