Laravel本地与线上环境路由重定向至www问题排查(Homestead环境)
我来帮你排查这个问题,Homestead环境下的域名处理确实有几个容易踩的坑,咱们一步步来解决:
1. 先搞定Homestead的核心配置(这是你之前忽略的关键)
Homestead默认用Nginx作为Web服务器,而你写的.htaccess是Apache的配置文件——Nginx根本不会读取它,这就是你之前的.htaccess规则完全没生效的原因!
首先修改你的Homestead.yaml文件里的站点配置,把不带www和带www的域名都映射到同一个项目目录:
sites: - map: example.test to: /home/vagrant/code/public - map: www.example.test to: /home/vagrant/code/public
然后更新本地电脑的hosts文件(Windows在C:\Windows\System32\drivers\etc\hosts,Mac/Linux在/etc/hosts),添加两条记录:
192.168.10.10 example.test 192.168.10.10 www.example.test
(注:192.168.10.10是Homestead默认的虚拟机IP,如果你的配置里改了IP,要对应替换)
最后执行命令让配置生效:
vagrant reload --provision
2. 修正你的中间件逻辑(方向搞反啦)
你之前的中间件是把带www的域名跳转到不带www,这和你想要的效果完全相反!改成下面的代码:
public function handle(Request $request, Closure $next) { // 如果请求的域名没有www前缀,301跳转到带www的版本 if (!str_starts_with($request->header('host'), 'www.')) { $newHost = 'www.' . $request->header('host'); $newUrl = str_replace($request->getHost(), $newHost, $request->fullUrl()); return redirect()->to($newUrl, 301); } return $next($request); }
然后把这个中间件注册到app/Http/Kernel.php里,比如加到web中间件组里,这样所有web请求都会经过这个跳转逻辑:
protected $middlewareGroups = [ 'web' => [ // 其他中间件... \App\Http\Middleware\YourRedirectMiddleware::class, ], ];
3. 验证效果&注意事项
- 先清除浏览器缓存(301跳转是会被浏览器缓存的,之前的错误跳转可能还残留)
- 访问
http://example.test,应该会自动跳转到http://www.example.test - 这时候再执行
dd($request->url()),就能看到正确的带www的URL了
额外说明:如果想用Nginx直接配置跳转
如果你不想用Laravel中间件,也可以在Homestead的Nginx站点配置里加跳转规则,但需要手动修改虚拟机里的Nginx配置文件,或者在Homestead.yaml里用extra字段添加规则,不过用Laravel中间件会更灵活,也方便后续在生产环境复用逻辑。
内容的提问来源于stack exchange,提问作者xenex-media
相关产品推荐
相关产品推荐

