在 Laravel 中重定向域名
Posted
技术标签:
【中文标题】在 Laravel 中重定向域名【英文标题】:Redirect domain name in Laravel 【发布时间】:2016-09-21 13:59:58 【问题描述】:我想在 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:
【问题讨论】:
Any route added to the end throws an exception:
是什么意思?
对不起,我不是特别清楚,我已经编辑了问题以反映我的意思。
【参考方案1】:
您需要使用通配符路由。 url 末尾的 GET 变量不会以您尝试的方式更改路由。访问http://example.com/?var1=A“计数”为访问定义为 Route::get('/', function() ) 的路由,因为您正在使用 GET 变量 var1 访问 example.com/。换句话说,为了确定 HTTP 请求应该选择哪个路由,通常会忽略 GET 变量。
通配符匹配使用正则表达式路由方式->where()
Route::group(['middleware' => ['redirects'] ], function ()
Route::any('/anything', 'HoldingSiteController@home')
->where('anything', '.*');
Route::any('/', 'HoldingSiteController@home');
);
如上所示,对于空请求,您还需要空路由 any('/')。此示例还包括“any”动词而不是“get”动词,以便在其请求匹配中更加贪婪。
Laravel - Using (:any?) wildcard for ALL routes?
https://laravel.com/docs/5.2/routing#parameters-regular-expression-constraints
【讨论】:
以上是关于在 Laravel 中重定向域名的主要内容,如果未能解决你的问题,请参考以下文章