phpEnv默认Nginx配置仅含一个server块且server_name为_或未设置,导致无法按Host头区分域名,所有请求均落入默认站点。

phpEnv 默认不支持多域名共用 80 端口的开箱即用配置,必须手动修改 Nginx 的 server 块结构,否则所有域名都会落到默认站点(通常是第一个 server 块)。
为什么 phpEnv 的默认 Nginx 配置无法区分域名
phpEnv 安装后生成的 Nginx 配置通常只含一个 server 块,且 server_name 是 _ 或未设置,导致它匹配任意 Host 头。即使你绑定了多个域名到同一 IP,Nginx 也只会走这一个入口,不会按域名路由。
- 典型表现:访问
a.test和b.test都显示同一个网站内容 - 根本原因:
server_name缺失或为通配符,Nginx 无法做 SNI 匹配 - phpEnv 的站点管理界面(如“添加站点”)默认只改
root和server_name,但不会为你新建独立server块,也不会禁用默认块
如何手动添加多个独立的 server 块(关键步骤)
phpEnv 的 Nginx 配置文件路径通常是 C:\phpEnv\nginx\conf\vhost\(Windows)或 /usr/local/phpenv/nginx/conf/vhost/(Linux/macOS),不要直接改 nginx.conf 主文件,而是往 vhost/ 目录里放单独的 .conf 文件。
- 每个域名建一个文件,例如
a.test.conf和b.test.conf - 每个文件里写完整
server块,必须包含listen 80、明确的server_name a.test、以及对应的root和index - 务必删掉或注释掉
vhost/下原有的默认配置(如default.conf),否则它会抢走所有未匹配的请求 - 检查
nginx.conf是否已启用vhost目录:确认有类似include vhost/*.conf;的行,且未被注释
示例 a.test.conf:
立即学习“PHP免费学习笔记(深入)”;
server {
listen 80;
server_name a.test;
root C:/phpEnv/www/a;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
本地测试时 hosts 和浏览器缓存容易出问题
Windows 用户常忽略 C:\Windows\System32\drivers\etc\hosts 文件没刷新,或浏览器对 301 重定向做了强缓存,导致改完配置后仍跳转到旧站。
- 改完
hosts后,必须运行ipconfig /flushdns(Windows)或sudo dscacheutil -flushcache(macOS) - 浏览器访问前,先用
curl -I http://a.test看响应头中的Server和X-Powered-By,确认是否真由新配置处理 - 如果看到 301 或跳转,清空浏览器缓存,或换隐身窗口测试;避免用 Chrome 直接输域名——它可能补
https://并跳过你的 HTTP 配置 - phpEnv 自带的 PHP-FPM 端口固定为
9000,多个站点共用没问题,但确保fastcgi_pass指向正确(别错写成127.0.0.1:9001)
phpEnv 的“站点复用”功能本质是路径复用,不是域名复用
phpEnv 界面里所谓“复用站点”,实际是指在同一个域名下用不同子目录部署多个项目(如 http://localhost/cms 和 http://localhost/api),它通过 location /cms/ + alias 实现。这和多域名共用 80 端口是两回事,混淆会导致配置写错位置。
- 如果你要的是
a.test和b.test,就必须走多个server块,不能靠location分流 - 多个
server块之间完全隔离:PHP 超全局变量$_SERVER['SERVER_NAME']、DOCUMENT_ROOT、日志路径都各自独立 - 证书(HTTPS)需单独配置:phpEnv 不自动申请或绑定 SSL,
listen 443 ssl必须手动加,且每个server块得有自己的ssl_certificate
真正麻烦的点不在写配置,而在于 phpEnv 没提供可视化开关来启停某个域名的 server 块——每次增删都要手改文件、nginx -t 校验、再 nginx -s reload,漏一步就全站 502。



















