homestead 域名不生效需同步 hosts 与 homestead.yaml 的 map 值,并执行 vagrant reload --provision;valet 改域名后需清 dns 缓存及 chrome hsts;nginx server_name 必须严格匹配 host 头;php artisan serve 不解析 host 头,无法绑定虚拟域名。

Homestead 的 vagrant up 后域名不生效?检查 hosts 和 YAML 配置是否同步
本地 Laravel 项目用 Homestead 跑虚拟域名,vagrant up 启动后浏览器打不开,大概率是 /etc/hosts(Mac/Linux)或 C:\Windows\System32\drivers\etc\hosts(Windows)没加对应条目,或者 Homestead.yaml 里写的 map 和 to 没对上。
实操建议:
-
Homestead.yaml中的map必须和 hosts 里写的域名完全一致(包括 www、.test 后缀等),比如map: myapp.test,hosts 就得有192.168.10.10 myapp.test - 改完
Homestead.yaml一定要执行vagrant reload --provision,只vagrant reload不会重配 Nginx 站点 - Windows 用户注意:用记事本编辑 hosts 时必须“以管理员身份运行”,否则保存无效
- 如果用了
type: apache,默认不支持.test域名(Nginx 才默认配了泛解析),得手动加ServerAlias
Laravel Valet 的 valet domain 改了但旧域名还跳转?清 DNS 缓存 + 检查 Chrome 的 HSTS
Valet 默认用 .test,你执行 valet domain local 改成 .local,但浏览器访问 myapp.test 还是自动跳 https://myapp.test——这不是 Valet 没生效,是 Chrome 记住了 HSTS 策略,或者系统 DNS 缓存没刷。
实操建议:
- 执行
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder(Mac)或ipconfig /flushdns(Windows)清本地 DNS - Chrome 地址栏输入
chrome://net-internals/#hsts,在 “Delete domain security policies” 输入myapp.test删除记录 -
valet domain只影响新 link 的项目,已valet link的项目需重新执行一遍valet link才会更新域名 - 避免用
.dev或.app:这些已被 Chrome 强制 HTTPS,就算 Valet 配了 HTTP 也跳 307
Nginx 配置里 server_name 写错导致 404?确认它和请求 Host 头严格匹配
自己搭 Nginx 跑 Laravel,配置写好了,nginx -t 也通过,但访问始终 404。常见原因是 server_name 值和浏览器发的 Host 请求头不一致,比如 Nginx 配了 server_name myapp.local,但你在浏览器输的是 http://localhost:8000——Nginx 根本不会进这个 server 块。
实操建议:
- 用
curl -H "Host: myapp.local" http://127.0.0.1测试,绕过 DNS 和浏览器限制,直击 Nginx 匹配逻辑 -
server_name支持通配符,但server_name *.local不匹配myapp.local(需写成server_name ~^.*\.local$或直接列全) - 多个
server块时,Nginx 优先匹配字面量,其次才匹配正则;没匹配上的请求会落到第一个server块(可能是个空站) - 别漏掉
listen 443 ssl下的server_name,HTTP 和 HTTPS 是两个独立块
为什么 php artisan serve 不能绑虚拟域名?它压根不处理 Host 头
php artisan serve 是 PHP 内置服务器,只做最简路由转发,不解析 Host 头,也不支持多域名绑定。你加 --host=myapp.test 只是让服务器监听那个 IP,并不会让浏览器通过域名访问它。
实操建议:
-
php artisan serve适合快速验证代码逻辑,别拿它测域名相关功能(如多租户、子域名识别) - 想本地测子域名?必须用反向代理(Nginx/Valet/Homestead),内置服务器无法区分
foo.myapp.test和bar.myapp.test - 如果硬要用
artisan serve配域名,只能靠 hosts 把域名指向127.0.0.1,再加--host=127.0.0.1,但所有域名都会进同一个应用,Laravel 拿不到原始 Host
真正卡住人的往往不是配哪行代码,而是改了配置却忘了 reload 服务、清了浏览器缓存却没清 HSTS、或者以为 artisan serve 能当生产环境代理用。这些地方一漏,排查两小时。










