phpenv不处理域名绑定,仅管理php版本;多域名需配置hosts文件、web服务器(apache的serveralias或nginx的server_name)及php运行时识别http_host。

phpenv 本身不处理域名绑定——它只是 PHP 版本管理工具,类似 rbenv 或 pyenv,只管切换 php 可执行文件版本,不碰 Web 服务器、DNS 或路由。
你要的「一个站点绑定多个域名」或「多个域名指向不同项目」,实际依赖的是:
- 系统
/etc/hosts(或 Windows 的C:\Windows\System32\drivers\etc\hosts) - Web 服务器配置(Apache 的
<virtualhost></virtualhost>,Nginx 的server_name) - PHP 运行时是否识别当前请求域名(比如用
$_SERVER['HTTP_HOST']判断)
phpenv 在这个链条里,只影响 php -v 输出和 CLI 下的 PHP 解释器版本,对 HTTP 请求完全无感。
为什么改了 phpenv 还是无法访问多域名?
因为浏览器发请求时,根本没经过 phpenv。它走的是:
浏览器 → DNS(本地 hosts 先查) → Web 服务器(Apache/Nginx) → PHP-FPM 或 mod_php → 你的代码
phpenv 不在其中任何一环,也不修改配置文件、不重启服务、不监听端口。
Apache 中一个站点绑定多个域名(ServerAlias)
如果你希望 site.test 和 www.site.test 都指向同一套代码,不用写两个 <virtualhost></virtualhost>,直接用 ServerAlias:
<virtualhost>
ServerName site.test
ServerAlias www.site.test dev.site.test
DocumentRoot "/Users/you/project/web"
<directory>
AllowOverride All
Require all granted
</directory></virtualhost>
-
ServerName必须有且唯一,是主域名 -
ServerAlias可写多个空格分隔的域名,大小写不敏感 - 所有匹配的域名都会进这个虚拟主机,
$_SERVER['HTTP_HOST']仍保留原始值,PHP 层可据此做逻辑分支 - 改完必须
sudo apachectl restart,否则不生效
Nginx 中一个 server 块支持多域名
Nginx 用 server_name 指令支持多域名,空格分隔即可:
server {
listen 80;
server_name site.test www.site.test dev.site.test;
root /Users/you/project/web;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/usr/local/var/run/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
- 注意:
server_name后面不能带http://,也不能带端口 - 如果要泛域名(如
*.site.test),需加引号:server_name "*.site.test" site.test; - 改完必须
sudo nginx -t && sudo nginx -s reload,仅-t不重载等于没改 - Nginx 不会自动读取新配置,
include路径写错、缺少分号、括号不闭合都会导致nginx -t报错
hosts 文件写错是最常见的 404/502 根源
所有本地多域名的前提是系统能正确把域名解析到 127.0.0.1。常见翻车点:
- 用普通用户权限保存
hosts文件 → 实际没写入,看起来保存成功但内容没变 - 混用空格和 tab → 某些系统解析失败,建议全用英文空格
- 写了
http://local.test或local.test:8080→ hosts 只认IP 域名格式 - 改完没刷新 DNS 缓存 → macOS 执行
sudo dscacheutil -flushcache,Windows 执行ipconfig /flushdns - 用了中文输入法下的全角字符(如全角空格、冒号)→ 看似正常,实则解析失败
真正容易被忽略的点是:Web 服务器配置和 hosts 必须严格一致——ServerName 写的是 api.local.test,而 hosts 里写的是 api.local.test.(末尾多了个点),就可能因 DNS 搜索域补全逻辑导致不匹配。这种细节不会报错,只会静默 404。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











