You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:06:46