必须同时修改hosts文件并配置Web服务器虚拟主机才能实现Mac上PHP项目域名访问:先以sudo nano /etc/hosts添加127.0.0.1 myapp.test,刷新DNS缓存;再在httpd-vhosts.conf或nginx.conf中严格匹配ServerName/server_name为myapp.test,DocumentRoot/root指向public目录,最后重载服务。

Mac上PHP开发环境的域名绑定,不是改完hosts就能访问——必须同时对齐Web服务器虚拟主机配置,否则浏览器打不开或直接跳转到MAMP/XAMPP默认页。
修改/etc/hosts添加本地域名映射
这是整个流程的起点,也是最容易出错的第一步。系统级域名解析不生效,后面全白搭。
- 用终端执行
sudo nano /etc/hosts以管理员权限编辑文件 - 在文件末尾新增一行,格式严格为:
127.0.0.1 myapp.test(注意:IP和域名之间是**一个空格**,不能用制表符或多个空格) - 保存后必须刷新DNS缓存,否则浏览器仍走旧记录:
sudo dscacheutil -flushcache(macOS Sonoma及更新系统)或sudo killall -HUP mDNSResponder(旧版本) - 验证是否生效:终端运行
ping myapp.test,应返回127.0.0.1;若显示未知主机,说明hosts没写对或没刷新
Apache虚拟主机配置必须匹配ServerName
MAMP、XAMPP或系统自带Apache都依赖httpd-vhosts.conf,其中ServerName值必须与hosts里写的域名**完全一致**,包括大小写和末尾点号。
- 确认
httpd.conf已启用虚拟主机模块:Include conf/extra/httpd-vhosts.conf这行不能被注释掉 - 编辑
/Applications/MAMP/conf/apache/extra/httpd-vhosts.conf(MAMP路径)或/etc/apache2/extra/httpd-vhosts.conf(系统Apache),追加:
<VirtualHost *:80>
ServerName myapp.test
DocumentRoot "/Users/yourname/Sites/myapp/public"
<Directory "/Users/yourname/Sites/myapp/public">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
-
DocumentRoot必须指向项目实际入口目录(如ThinkPHP的public/、Laravel的public/),不是项目根目录 - 如果用MAMP Pro,可在GUI里勾选“Use virtual host”并填入相同
ServerName,它会自动生成配置,但依然要检查生成内容是否含AllowOverride All
Nginx配置server_name需同步更新
如果你用Homebrew装的Nginx而非MAMP,server_name字段就是唯一识别依据,拼错、漏点、多空格都会导致404。
GitHub Hosts 更新工具(仅限中国用户),安全更新系统hosts文件,保留原有非GitHub条目,仅替换GitHub相关地址。支持备份恢复和风险提示。用于解决GitHub访问问题。
立即学习“PHP免费学习笔记(深入)”;
- 编辑
/usr/local/etc/nginx/nginx.conf或/usr/local/etc/nginx/servers/myapp.test - 确保
server块内有:server_name myapp.test;(结尾分号不能少) -
root路径要精确到public/目录:root /Users/yourname/Sites/myapp/public; - PHP转发必须启用:
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; ... },且确认php-fpm服务已启动(brew services start php) - 改完配置必须重载:
sudo nginx -s reload,不是restart——reload才不中断连接
常见错误现象与快速定位法
90%的“域名打不开”问题,其实只卡在三个地方中的某一个,按顺序排查效率最高。
- 浏览器输入
http://myapp.test显示“无法连接” → 先查ping myapp.test,不通就退回hosts文件检查格式和缓存刷新 - 能ping通但显示MAMP默认页或403 Forbidden → 检查虚拟主机
DocumentRoot路径是否存在、权限是否正确(ls -l看用户组)、AllowOverride All是否启用 - 显示502 Bad Gateway(Nginx)或空白页(Apache) → 查
php-fpm是否运行(ps aux | grep php-fpm),端口是否冲突(lsof -i :9000) - ThinkPHP/Laravel等框架报404 → 确认框架路由配置是否启用域名部署(如ThinkPHP的
url_domain_deploy设为true),不是Web服务器问题
真正麻烦的从来不是步骤多,而是三处域名字符串——hosts、ServerName/server_name、框架路由绑定——只要有一个字母或标点不一致,整个链路就断了。


















