laravel, как перенаправить на лучший URL - PullRequest
0 голосов
/ 10 мая 2018

как я могу изменить или перенаправить URL, если кто-то ввел неверный URL, например: domain.com/id/name, правильный URL = domain.com/12/appdev неправильный URL = domain.com/12/devapp

Я хочу перенаправить URL-адрес на domain.com/12/appdev, если кто-то введет domain.com/12/devapp

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Один из способов добиться этого - создать маршрут по умолчанию, который будет получать что угодно, пытаясь найти правильный маршрут с помощью какой-либо функции, а затем перенаправить пользователя, например:

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', '.+');

Одна вещь здесьдолжен быть уверен, что приложение не будет перенаправлять на защищенный маршрут.Вы можете попытаться создать белый список возможных перенаправлений.

0 голосов
/ 11 мая 2018

Здание на вершине того, что Felippe Duratte сказал; Я думаю, что было бы лучше обработать это внутри app / Exception / Handler.php следующим образом (вместо того, чтобы создавать для него выделенный перехват всех маршрутов):

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
}

Код не проверен, но что-то в этом роде должно быть выполнено.

0 голосов
/ 10 мая 2018

Попробуйте это

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

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

});
...