修改 hosts 文件是第一步,因为本地绑定域名本质是绕过 DNS 查询,让系统将域名直接解析到 127.0.0.1 或 ::1;不修改则浏览器无法将请求发往本地 PHP 服务。

为什么修改 hosts 文件是第一步
本地绑定域名本质是绕过 DNS 查询,让系统把某个域名直接解析到 127.0.0.1 或 ::1。不改 hosts,浏览器根本不会把请求发到你本地的 PHP 服务。
Windows 路径:C:/Windows/System32/drivers/etc/hosts
macOS / Linux 路径:/etc/hosts
- 用管理员(或 sudo)权限打开编辑器修改,否则保存失败
- 新增一行即可,例如:
127.0.0.1 myapp.test - 不要写
http://,也不加端口(127.0.0.1:8000 myapp.test无效) - 改完后执行
ping myapp.test,看到回复127.0.0.1才算生效
PHP 内置服务器如何支持自定义域名
PHP 7.4+ 的 php -S 默认只监听 127.0.0.1:8000,且不处理 Host 头校验——这意味着只要 hosts 指向正确,它就能响应 myapp.test 的请求,但需显式绑定地址。
- 必须用
0.0.0.0:8000或[::]:8000启动,否则仅响应localhost或127.0.0.1 - 命令示例:
php -S 0.0.0.0:8000 router.php
-
router.php需存在,哪怕只写,否则启动报错 - 浏览器访问
http://myapp.test:8000即可,无需额外配置
Apache / Nginx 中 PHP 项目绑定域名的关键点
和内置服务器不同,Apache/Nginx 是真正按 Host 头分发请求的,必须显式配置虚拟主机(VirtualHost),否则会落到默认站点或 404。
- Apache:确保
httpd.conf或apache2.conf中启用了vhost_alias模块,并在httpd-vhosts.conf中添加:
ServerName myapp.test DocumentRoot "/path/to/your/php/project" AllowOverride All Require all granted
- Nginx:在
nginx.conf或站点配置文件中写:
server {
listen 80;
server_name myapp.test;
root /path/to/your/php/project;
index index.php;
location ~ /.php$ {
fastcgi_pass 127.0.0.1:9000; # 或 unix socket
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
立即学习“PHP免费学习笔记(深入)”;
- 改完必须重启服务:
sudo apachectl restart或sudo nginx -s reload - 如果用 MAMP/XAMPP,它们通常自带虚拟主机管理界面,但底层仍是改上述配置文件
常见 403 / 404 / 连接被拒绝问题排查
绑定域名后打不开,大概率不是 PHP 问题,而是网络层或服务层卡住了。
-
ERR_CONNECTION_REFUSED:PHP 服务根本没运行,或端口被占用;检查lsof -i :8000(macOS/Linux)或netstat -ano | findstr :8000(Windows) -
ERR_CONNECTION_TIMED_OUT:hosts没生效,或防火墙拦截了端口;确认ping myapp.test回复的是127.0.0.1 -
403 Forbidden:Web 服务器拒绝读取目录,常见于 Apache 的Require all denied默认策略,或 Nginx 的root路径权限不足 -
404 Not Found:路由没匹配上,尤其用 PHP 内置服务器时,router.php返回false会触发 404;检查是否漏写了该文件,或逻辑返回了false
最易忽略的是:改了 hosts 和配置,却忘了清浏览器 DNS 缓存(Chrome 地址栏输 chrome://net-internals/#dns 点 Clear host cache)。
