Laravel怎么配置虚拟域名 _ Laravel 本地环境解析方法【教程】

8次阅读

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

Laravel怎么配置虚拟域名 _ Laravel 本地环境解析方法【教程】

Homestead 的 vagrant up 后域名不生效?检查 hosts 和 YAML 配置是否同步

本地 laravel 项目用 Homestead 跑虚拟域名,vagrant up 启动后浏览器打不开,大概率是 /etc/hosts(Mac/linux)或 C:windowsSystem32driversetchosts(Windows)没加对应条目,或者 Homestead.yaml 里写的 mapto 没对上。

实操建议:

  • 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.testbar.myapp.test
  • 如果硬要用 artisan serve 配域名,只能靠 hosts 把域名指向 127.0.0.1,再加 --host=127.0.0.1,但所有域名都会进同一个应用,Laravel 拿不到原始 Host

真正卡住人的往往不是配哪行代码,而是改了配置却忘了 reload 服务、清了浏览器缓存却没清 HSTS、或者以为 artisan serve 能当生产环境代理用。这些地方一漏,排查两小时。

text=ZqhQzanResources