hosts文件必须以管理员权限编辑保存,否则修改无效;其标准路径为C:\Windows\System32\drivers\etc\hosts,编辑后需执行ipconfig /flushdns刷新DNS缓存。

hosts 文件必须用管理员权限保存,否则改了也白改
Windows 下 C:\Windows\System32\drivers\etc\hosts 是受系统保护的文件,普通记事本直接“另存为”或拖进文件夹覆盖,大概率失败且不报错。常见现象是:你明明加了 127.0.0.1 test.local,保存后重开文件却消失,或者浏览器仍提示 DNS_PROBE_FINISHED_NXDOMAIN。
正确做法只有两种:
- 右键记事本 → “以管理员身份运行”,再通过“文件 → 打开”选中 hosts 文件编辑保存
- 用 VS Code、Notepad++ 等编辑器,右键图标选择“以管理员身份运行”,再打开并编辑 hosts
改完别忘了执行 ipconfig /flushdns 刷新本地 DNS 缓存,否则旧缓存可能持续几分钟甚至更久。
Apache 虚拟主机配置里 DocumentRoot 必须指向 public/ 目录
PHP 项目(尤其是 Laravel、ThinkPHP、Symfony)入口统一在 public/ 或 web/ 子目录,DocumentRoot 若写成项目根目录(比如 C:/xampp/htdocs/myapp),会导致敏感目录如 app/、config/、.env 被直接 HTTP 访问,轻则泄露配置,重则被利用。
立即学习“PHP免费学习笔记(深入)”;
典型错误配置:
<VirtualHost *:80> DocumentRoot "C:/xampp/htdocs/myapp" <!-- ❌ 错!会暴露 .env --> ServerName myapp.test </VirtualHost>
正确写法(以 ThinkPHP 为例):
<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs/myapp/public" <!-- ✅ 入口必须是 public/ -->
ServerName myapp.test
<Directory "C:/xampp/htdocs/myapp/public">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>同时确认 httpd.conf 中已启用:Include conf/extra/httpd-vhosts.conf(去掉开头的 #)。
访问 test.local 却看到 Apache 默认页?检查 ServerName 是否匹配
现象:hosts 已改、Apache 重启过、URL 输入 http://test.local,但页面显示的是 Apache 的 “It works!” 或 XAMPP 默认首页,而不是你的 PHP 页面。
原因几乎一定是虚拟主机配置未生效,常见于:
-
ServerName和 hosts 里写的域名不完全一致(比如 hosts 写test.local,vhost 写www.test.local,但没配ServerAlias) - Apache 启动时加载了多个 vhost 配置,而第一个
<VirtualHost *:80>是默认的 localhost 配置,它“兜底”捕获了所有未明确匹配的请求 - 配置文件路径写错,比如
httpd-vhosts.conf里用了反斜杠\而非正斜杠/,Windows 下部分 Apache 版本会静默忽略整段
快速验证方式:在浏览器地址栏输入 http://test.local:80(显式加端口),再看是否仍是默认页;如果是,说明请求根本没进你的 vhost,得回头查 ServerName 和配置加载顺序。
ThinkPHP 的 app.domain_bind 不是域名绑定开关,只是运行时校验
很多人在 config/app.php 里设了 'domain_bind' => ['test.local'],结果访问 http://test.local 还是 404,就以为配置失败——其实这是两回事。
app.domain_bind 是框架层的白名单机制,只在请求进来后才触发比对:$_SERVER['HTTP_HOST'] 必须和数组里字符串**完全相等**(含端口、不含协议)。例如:
- 你访问
http://test.local:8080,但domain_bind里只写了'test.local'→ 不匹配 → 404 - 你用 HTTPS 访问,但配置里没写
'https://test.local'→ 不匹配 → 404(虽然实际不会这么写,但框架确实按字面比对)
建议调试时先临时注释掉 domain_bind,确认页面能正常加载后再开启;真正要解决“打不开”,优先查 hosts + Apache vhost + DocumentRoot,不是框架配置。
本地开发环境里,域名解析和 Web 服务路由是操作系统和 Apache 的事,PHP 框架只管接住请求并处理——这点容易混淆,但恰恰是问题定位的关键分界点。



















