商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > phpEnv配置多域名指向同一根目录 phpEnv别名域名

phpEnv配置多域名指向同一根目录 phpEnv别名域名

  发布于2026-07-09 阅读(0)

扫一扫,手机访问

坦白说,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.testlocal.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 必须同时出现在 httphttps 两个 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 文件里做映射。这两步,少一个都不行。

本文转载于:https://www.php.cn/faq/2413999.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注