如果URL中不存在,如何重定向到默认语言

时间:2013-10-14 10:07:28

标签: .htaccess laravel laravel-4

我正在使用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或路由文件?

我无法配置它。谢谢!

2 个答案:

答案 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

创建中间件 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',

可选

既然您已经设置了应用语言环境,现在您可能希望让客户端根据需要更改他们的语言环境。

  1. 使用 php artisan make:controller AppLocaleController 创建控制器
  2. 在控制器中创建方法更新 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);
}
  1. 注册控制器路由
Route::post('/api/setLocale', [\App\Http\Controllers\AppLanguageController::class, 'update'])
    ->name('locale.update');