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

Laravel多语言站点{locale?}路由前缀访问返回404,请求解决

问题分析与解决方案

你的问题核心是可选locale前缀的路由匹配异常:不带前缀时路由正常匹配,但带/it前缀时返回404,本质是路由定义规则和中间件逻辑的双重问题。

可能的触发原因

  1. 路由匹配规则冲突:当前路由组内的get('/')会生成/{locale?}/格式的路由,仅匹配带尾部斜杠的URL(如example.com/it/),而example.com/it无法匹配,直接返回404。
  2. Locale中间件逻辑缺失:中间件未正确处理可选的locale参数,或对传入的locale合法性验证失败后直接返回404。
  3. 冗余参数干扰:路由组闭包中的$locale参数无实际作用,属于冗余代码。

具体解决方案

方案1:调整路由定义,兼容带/不带尾部斜杠的URL

将路由组内的get('/')改为get('', ...),生成的路由格式为/{locale?},可同时匹配根路径/和带locale的路径/it:

Route::group(['prefix' => '{locale?}', 'middleware' => ['web', 'locale', 'theme', 'currency']], function () {
    
    Route::get('', 'HomeController@index')
        ->defaults('_config', [
            'view' => 'shop::home.index'
        ])->name('shop.home.index');
    
});

方案2:拆分路由结构(更清晰易维护)

将不带locale的根路径单独定义,带locale的路由组使用必填参数,避免可选参数的匹配歧义:

// 根路径:直接返回默认语言页面,或重定向到带en前缀的URL
Route::get('/', function () {
    // 二选一:直接调用控制器,或重定向
    // return app(HomeController::class)->index();
    return redirect()->route('shop.home.index', ['locale' => 'en']);
})->name('home');

// 带locale的路由组,使用必填前缀参数
Route::group(['prefix' => '{locale}', 'middleware' => ['web', 'locale', 'theme', 'currency']], function () {
    Route::get('/', 'HomeController@index')
        ->defaults('_config', [
            'view' => 'shop::home.index'
        ])->name('shop.home.index');
});

关键:修复Locale中间件逻辑

确保中间件正确处理locale参数,设置默认语言并验证合法性:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class Locale
{
    // 定义允许的语言列表
    protected $allowedLocales = ['en', 'it'];

    public function handle(Request $request, Closure $next)
    {
        // 获取路由参数中的locale,无则使用默认值en
        $locale = $request->route('locale') ?? 'en';
        
        // 验证locale合法性,不合法则返回404
        if (!in_array($locale, $this->allowedLocales)) {
            abort(404);
        }
        
        // 设置应用语言
        app()->setLocale($locale);
        
        return $next($request);
    }
}

额外检查项

  • 确认locale中间件已在app/Http/Kernel.php的web中间件组或路由中正确注册
  • 执行php artisan route:clear清除路由缓存,避免旧缓存导致的匹配异常

内容的提问来源于stack exchange,提问作者sfarzoso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:02:04