phpEnv配置多域名指向同一根目录 phpEnv别名域名
通过修改phpEnv内置Nginx的server_name字段,以空格分隔添加多个域名,并同步编辑系统hosts文件添加对应映射,可以使得多个域名指向同一根目录。之后请执行nginx-t检查语法,然后再重载Nginx配置,并请注意刷新DNS缓存,即可实现多域名解析。
坦白说,phpEnv 本身并不直接处理多域名绑定这件事。想让多个域名指向同一个根目录,本质上靠的是两样东西的配合:phpEnv 内置的 Nginx 配置,加上系统的 hosts 文件。别名域名并不是 phpEnv 给你开了个什么开关,说白了,就是在 Nginx 的 server_name 指令里多写几个域名而已。
phpEnv 的 Nginx 配置文件在哪、怎么改
phpEnv 默认把站点配置扔在 /phpenv/vhost/ 目录下,每个站点对应一个 .conf 文件(比如 default.conf 或者你自定义的站点名.conf)。它不像宝塔那样给你一个“别名”的图形入口,所有域名都得手动塞进 server_name 那一行。
- 找到站点对应的
.conf文件(比如default.conf),用管理员权限打开它 - 找到类似
server_name localhost;这一行 - 改成用空格分隔的多个域名,像这样:
server_name local.test www.local.test api.local.test; - 注意,域名之间用空格隔开就行,千万别加逗号,也别换行,更不能带
http://或者端口号 - 改完之后,务必在终端里跑一遍
nginx -t检查语法,没问题再执行nginx -s reload让配置生效 - 要是改完了,新域名访问还是 404,十有八九是
nginx -s reload没执行,或者系统 hosts 文件里没加上对应的映射
hosts 文件必须同步加,而且格式要严丝合缝
phpEnv 可不会自动帮你写 hosts 文件。这一步要是漏了,浏览器根本没法把你的请求发到本地的 Nginx。Windows 系统的 hosts 文件在 C:\Windows\System32\drivers\etc\hosts,macOS 或 Linux 则在 /etc/hosts。
- 每一行只写一个映射,比如
127.0.0.1 local.test,前后不要有多余的空格或 tab 键 - 千万别以为写了
www.local.test,local.test就自动生效了——这两个是独立的域名,需要分别添加 - 加完保存后,在终端里运行
ping local.test,确认返回的地址是127.0.0.1。否则,Nginx 根本收不到这个 Host 头 - Windows 用户改完 hosts 后,建议顺手跑一下
ipconfig /flushdns刷新 DNS 缓存;macOS 用户则执行sudo dscacheutil -flushcache
为什么加了 server_name 还是跳默认站或 404
遇到这种情况,通常不是 phpEnv 的锅,而是 Nginx 的匹配逻辑被绕过了。Nginx 会按 server 块的顺序来匹配,第一个 server_name 匹配上的才会生效。
- 检查一下有没有其他
server块(比如default.conf)监听了*:80端口,并且它的server_name是空的或者设为_。这种配置会像一个兜底网,捕获所有未匹配的域名 - 确认你的目标
.conf文件确实被主nginx.conf里的include指令加载了,路径别写错了 - 如果你用了 HTTPS,
server_name必须同时出现在http和https两个server块里。否则,HTTP 域名能通,HTTPS 域名就会 404 - 还有一点要注意,phpEnv 默认可能开启了“防跨站”机制。如果根目录下有
.user.ini文件或者启用了open_basedir,新增域名访问时,PHP 可能会因为路径限制报错。这可不是 Nginx 层面的 404,而是 PHP 层面的问题了
想让不同域名显示不同页面,但共用同一套代码
这时候,光靠 Nginx 配置就不够了,需要在 PHP 的入口层做判断。比如,可以在 index.php 的开头加上这样一段逻辑:
if ($_SERVER['HTTP_HOST'] === 'api.local.test') {
require __DIR__ . '/api/index.php';
exit;
}
if ($_SERVER['HTTP_HOST'] === 'admin.local.test') {
require __DIR__ . '/admin/index.php';
exit;
}
- 这种方案的优点是,用户地址栏里始终显示的是自己输入的域名,不会跳转
- 需要注意的是,
$_SERVER['HTTP_HOST']这个值客户端是可以伪造的。在生产环境中,最好配合一个白名单来做校验,安全第一 - 如果你用的是 Lara vel 这类框架,更推荐在路由层或者中间件里做域名分流,而不是在入口文件里硬编码
require - 千万别想着用
header("Location: ...")跳转来模拟——那样会暴露真实路径,对 SEO 也不友好
最后想叮嘹一句,其实最容易被忽略的就是配置重载这件事。很多人卡在“明明写了域名却打不开”这一步,其实只是忘了敲 nginx -s reload,或者忘了在 hosts 文件里做映射。这两步,少一个都不行。


































