【问题标题】:laravel, how to redirect to the best URLlaravel,如何重定向到最佳 URL
【发布时间】:2018-10-21 03:56:38
【问题描述】:

如果有人输入了错误的 URL,我如何更改或重定向 URL,例如:domain.com/id/name, 正确的 url = domain.com/12/appdev 不正确的 url = domain.com/12/devapp

如果有人键入 domain.com/12/devapp,我想将 url 重定向到 domain.com/12/appdev

【问题讨论】:

  • 我很确定唯一的方法就是创建另一条简单地重定向到正确路线的路线。
  • 是的,这是一条不同的路线,而不是 URI 的错字(考虑 mod_speling)。会考虑您将接受的明确路线。很好奇您设想的替代方案。
  • @Joas 但我该如何做重定向
  • 如果你用谷歌搜索“Laravel 重定向”,第一个结果就是该问题的答案。请先尝试在 Google 上搜索您的问题,然后再在这里提问。

标签: php laravel url redirect routes


【解决方案1】:

试试这个

Route::get('12/devapp', function () {

    return Redirect::to('/12/appdev', 301);

});

【讨论】:

    【解决方案2】:

    实现这一点的一种方法是创建一个默认路由,它会得到任何东西,尝试使用某些函数找到正确的路由,然后重定向用户,如下所示:

    Route::get('/{wrongRoute?}', function ($inputRoute) {
        $routeCollection = Route::getRoutes();
        $rate = 255;
        $nextRoute = false;
        foreach($routeCollection as $route) {
            $route = $route->uri;
            //example of function to find the best match
            $routeRate = levenshtein($inputRoute, $route);
            if($routeRate < $rate) {
                $rate = $routeRate;
                $nextRoute = $route;
            }
        }
        return Redirect::to($nextRoute, 301);
    })->where('wrongRoute', '.+');
    

    这里的一件事是确保应用程序不会重定向到受保护的路由。您可以尝试创建可能重定向的白名单。

    【讨论】:

      【解决方案3】:

      建立在Felippe Duratte 所说的之上;我认为最好像这样在 app/Exception/Handler.php 中处理这个问题(而不是为它创建一个专门的 catch all 路由):

      当你访问一个不存在的路由时,Laravel 会抛出 NotFoundHttpException。

      <?php
      
      class Handler extends ExceptionHandler
      {
      
          // ... snipped
      
          public function render($request, Exception $e)
          {
              if ($e instanceof NotFoundHttpException) {
      
                  $closestUri = $this->closestUri($request->path());
      
                  if ($closestUri) {
      
                      return redirect($closestUri);
      
                  }
      
              }
      
              return parent::render($request, $e);
          }
      
          protected function closestUri($notFoundUri)
          {
              $availableRoutePaths = [];
              foreach (Route::getRoutes() as $route) {
                  $availableRoutePaths[] = $route->getPath();
              }
      
              $closest = null;
              $shortest = -1;
      
              foreach ($availableRoutePaths as $availableRoutePath) {
      
                  $lev = levenshtein($notFoundUri, $availableRoutePaths);
      
                  if ($lev == 0) {
                      $closest = $word;
                      $shortest = 0;
                      break;
                  }
      
                  if ($lev <= $shortest || $shortest < 0) {
                      $closest  = $word;
                      $shortest = $lev;
                  }
      
              }
      
              return $closest;
          }
      
          // ... snipped
      }
      

      代码未经测试,但类似的东西应该可以完成工作。

      【讨论】:

        猜你喜欢
        • 2020-11-07
        • 1970-01-01
        • 2010-09-19
        • 1970-01-01
        • 2015-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多