我想在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:
答案 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