我正在使用Mcamara Laravel /本地化(https://github.com/mcamara/laravel-localization)并且我想重定向到默认语言,如果它不存在于用于搜索引擎优化目的的URL中。
如果我访问www.mydomain.com,它应该重定向到www.mydomain.com/en。如果我去www.mydomain.com/something,它应该重定向到www.mydomain.com/en/something。
我想通过www.mydomain.com和www.mydomain.com/en重定向以避免重复内容,因为它们是相同的内容和相同的语言。我不希望两个URL具有相同的内容。如果您的默认语言为“en”,则您在www.mydomain.com和www.mydomain.com/en /
上拥有相同的内容如何进行此重定向? .htaccess或路由文件?
我无法配置它。谢谢!
答案 0 :(得分:3)
我从未使用过mcamara / laravel-localization包,但我想你可以创建一个简单的路径来检测何时没有在URL中设置语言并重定向到默认语言。
类似的东西:
Route::get('/', function(){
return Redirect::to(Config::get('app.default_language'));
});
但是我建议你设置一个cookie,这样当用户切换到另一种语言时你会保留这种语言,如果用户回到主页“/”,你会重定向到这种语言,而不是默认语言。 / p>
根据OP评论进行更新:
如果您想重定向所有不包含语言的路线,您需要执行类似的操作:
应用/ filters.php:强>
App::before(function($request){
$params = explode('/', Request::path());
if(count($params) >= 1){
$language = $params[0];
$languages = Config::get('app.languages'); //Available languages in your app ex.: array('en', 'fr', 'es')
if(!in_array($language, $languages)){
$default_language = Config::get('app.default_language');
return Redirect::to($default_language.'/'.Request::path());
}
}
});
注意:我没有尝试使用该代码,仅供参考。
答案 1 :(得分:1)
这个答案的灵感来自@FR6,他的答案很旧,没有涵盖所有问题,所以我做了另一个实现。
我通过中间件和路由分组处理了这个问题 在 Laravel 8.0 中测试
在你的路由文件 web.php 中将所有需要本地化参数的路由分组
Route::group([
'prefix' => '{locale}',
'middleware' => 'setLocale'
], function() {
// put your routes here
Route::get('/welcome', function(){
return "Hello";
}
});
// add this so when you call route('...') you don't get the error "parameter 'locale' is not set"
// this is required because all laravel's default auth routes won't add the 'locale' parameter
\Illuminate\Support\Facades\URL::defaults(['locale' => app('locale-for-client')]);
// redirect the home page route to a specific locale
Route::get('/', function () {
return redirect(app('locale-for-client'));
});
使用 php artisan make:middleware SetLocale
在 app\Middleware\SetLocale.php 中,如果在给定的 url 上没有找到语言环境,我们将重定向到正确的路由
public function handle(Request $request, Closure $next)
{
$url_lang = $request->segment(1);
if($url_lang !== 'api') {
if (!in_array($url_lang, config('app.locales'), true)) {
return redirect(app('locale-for-client') . '/' . request()->path());
}
app()->setLocale($url_lang);
}
return $next($request);
}
在app\Http\Kernel.php
中注册中间件protected $routeMiddleware = [
...
'setLocale' => \App\Http\Middleware\SetLocale::class,
];
在 AppServiceProvider 中,我们将定义后备语言。 在我的实现中,我使用客户端 cookie 和浏览器定义的语言环境来获取客户端语言环境。
public function register()
{
$this->app->singleton('locale-for-client', function(){
$seg = request()->segment(1);
if(in_array($seg, config('app.locales'), true))
{
// if the current url already contains a locale return it
return $seg;
}
if(!empty(request()->cookie('locale')))
{
// if the user's 'locale' cookie is set we want to use it
$locale = request()->cookie('locale');
}else{
// most browsers now will send the user's preferred language with the request
// so we just read it
$locale = request()->server('HTTP_ACCEPT_LANGUAGE');
$locale = substr($locale, 0, 2);
}
if(in_array($locale, config('app.locales'), true))
{
return $locale;
}
// if the cookie or the browser's locale is invalid or unknown we fallback
return config('app.fallback_locale');
});
}
接下来要在 config\app.php
中设置您的区域设置 'locales' => ['en', 'ar', 'fr'],
'locales_text_display' => ['en' => 'English', 'ar' => 'العربية', 'fr' => 'Français'],
'fallback_locale' => 'en',
既然您已经设置了应用语言环境,现在您可能希望让客户端根据需要更改他们的语言环境。
php artisan make:controller AppLocaleController
创建控制器public function update()
{
if(in_array(request('locale'), config('app.locales'), true))
{
// using cookie('locale', request('locale')) will encrypt the cookie
// manually set the cookie
header("Set-Cookie:locale=".request('locale').";Max-Age=300000;path=/");
return redirect(url('/'));
}
abort(400);
}
Route::post('/api/setLocale', [\App\Http\Controllers\AppLanguageController::class, 'update'])
->name('locale.update');