在Laravel中重定向域名

时间:2016-05-24 11:23:27

标签: php laravel laravel-5

我想在Laravel 5中重定向短链接域,例如xyz.com到examplesite.com,同时维护URI请求。例如:

xyz.com/something?foo=var

将重定向到:

example.com/something?foo=var

我尝试在路由中使用域组,但它似乎不适用于域名级别,只适用于子域名。我选择的另一个选项是MiddleWare路线。

我已经设置了一个工作中间件“RedirectsMiddleware”并在我的路线文件中包含以下内容:

Route::group(['middleware' => ['redirects'] ], function () {
    Route::get('/', 'HoldingSiteController@home');
});

我的RedirectsMiddleware看起来像这样:

...
    public function handle($request, Closure $next)
    {
        $protocol = stripos($_SERVER['SERVER_PROTOCOL'],'https') === true ? 'https://' : 'http://';        
        $host = $_SERVER['SERVER_NAME'];
        $defaulthost = 'example.com';

        if($host != $defaulthost) {

            return Redirect::to($protocol . $defaulthost . $_SERVER['REQUEST_URI']);
        }

        return $next($request);
    }
...

当仅仅请求“example.com”或“example.com/?something=something”时,它会重定向。添加到最后的任何路线,例如“example.com/someroute”总是抛出异常,查询字符串无效。尽管我的MiddleWare重定向,它似乎正在寻找那条路线:

NotFoundHttpException in RouteCollection.php line 161:

1 个答案:

答案 0 :(得分:3)

您需要使用通配符路由。网址末尾的GET变量不会以您尝试的方式更改路线。访问http://example.com/?var1=A"计数"因为您正在使用GET变量var1访问 example.com / ,所以命中路由定义为Route :: get(' /',function(){})。换句话说,为了确定HTTP请求应该选择哪条路由,通常会忽略GET变量。

通配符匹配使用正则表达式路由方法 - > where()

Route::group(['middleware' => ['redirects'] ], function () {
    Route::any('/{anything}', 'HoldingSiteController@home')
        ->where('anything', '.*');
    Route::any('/', 'HoldingSiteController@home'); 
});

如上所示,对于空请求,您还需要空路径(' /')。这个例子还包括" any"动词而不是" get"动词在请求匹配中更加贪婪。

Laravel - Using (:any?) wildcard for ALL routes?

https://laravel.com/docs/5.2/routing#parameters-regular-expression-constraints