Laravel中为每种语言配置独立域名的实现方案求助
为mcamara/laravel-localization配置独立域名的解决方案
1. 配置域名与语言的映射
先发布扩展的配置文件(未发布过的话执行):
php artisan vendor:publish --provider="Mcamara\LaravelLocalization\LaravelLocalizationServiceProvider"
在config/laravellocalization.php中新增域名-语言映射数组:
'domain_locales' => [ 'my-english-website.com' => 'en', 'my-dutch-website.com' => 'nl', ],
2. 自定义本地化中间件
创建app/Http/Middleware/LocalizeByDomain.php,替换默认中间件逻辑,从域名识别当前语言:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Mcamara\LaravelLocalization\Facades\LaravelLocalization; class LocalizeByDomain { public function handle(Request $request, Closure $next) { $domain = $request->getHost(); $domainLocales = config('laravellocalization.domain_locales'); $targetLocale = $domainLocales[$domain] ?? config('app.fallback_locale'); app()->setLocale($targetLocale); LaravelLocalization::setLocale($targetLocale); return $next($request); } }
在app/Http/Kernel.php中,将原有的LaravelLocalizationRoutes和LaravelLocalizationRedirectFilter中间件替换为自定义的LocalizeByDomain,注意保持中间件顺序合理。
3. 重写URL生成逻辑
扩展默认通过URL前缀生成本地化链接,我们自定义方法生成对应域名的链接。在app/helpers.php中添加辅助函数:
function localized_domain_url($locale, $path = '/') { $domainLocales = config('laravellocalization.domain_locales'); $domain = array_search($locale, $domainLocales) ?? config('app.url'); return url()->to($path, [], true)->setHost(parse_url($domain, PHP_URL_HOST)); }
使用示例:
{{ localized_domain_url('en') }} {{-- 输出 my-english-website.com --}} {{ localized_domain_url('nl', '/about') }} {{-- 输出 my-dutch-website.com/about --}}
4. 调整路由配置
移除路由中的语言前缀包裹,直接定义路由即可:
// routes/web.php Route::get('/', function () { return view('welcome'); }); Route::get('/about', [AboutController::class, 'index'])->name('about');
5. 服务器配置
确保所有目标域名的虚拟主机(Nginx/Apache)都指向同一个Laravel项目的public目录,HTTPS环境下配置好对应证书。
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

