Laravel route без слэшей

сайт недавно был перенесен на laravel, до этого все адреса были вида:

https://домен.ру/category/

А когда прописали все роуты, адреса начали идти:

https://домен.ру/category

Т.е. ларавел убирает все слеши в конце урла. Прошлые адреса все проиндексированы уже поисковиками и если оставить как есть, то боты начнут цеплять новые ссылки без слэша и ругаться на дублирование.

У меня есть первый вариант, настроен middleWare для всех маршрутов чтобы в адрес подставлялся слэш в конец с 301 редиректом. Но тогда последующее добавление товаров/новостей будет всегда с 301 редиректом появляться на сайте.

public function handle($request, Closure $next)
    {

        $url = explode('?', $request->getRequestUri());

        if (isset($url[1])) {
            if (!preg_match('/.+\/$/', $url[0])) {
                $base_url = request()->root();
                return Redirect::to($base_url . $url[0] . '/?' . $url[1], 301);
            }
        } else {
            if (!preg_match('/.+\/$/', $request->getRequestUri())) {
                $base_url = request()->root();
                return Redirect::to($base_url . $request->getRequestUri() . '/', 301);
            }
        }

        return $next($request);
    }

Или же я думал наоборот сделать, чтобы все адреса которые заходят со слэшем в конце получали 301 редирект на адрес без слеша, чтобы так со временем индексируемые страницы перешли на текущую маршрутизацию, а новые адреса уже индексировались без слеша.

Для первого варианта у меня все готово, но как реализовать второй вариант не пойму, пытаясь изменить текущий код в обратную сторону получаю бесконечные перезагрузки страниц. Подскажите может кто сталкивался с этим и как тут поступить?


Ответы (1 шт):

Автор решения: Игорь Витальевич

Вроде как вывел для себя несколько решений, не знаю на сколько они правильные.

Первое это то, что я описал выше, т.е. все роуты попадают в middleWare, где проверяется, есть слеш в конце или нет, если слеша нет в конце или его нет перед GET параметрами (домен.ру/category или домен.ру?param=123) то происходит 301 редирект на (домен.ру/category/ или домен.ру/?param=123). Но тут появляется минус, когда ссылки сайта будут пополнятся, то все они будут всегда с 301 редиректом в индексации сайта.

Второе работает в обратную сторону, т.к. у меня уже текущие ссылки проиндексированы со слешами, я решаю в middleWare искать как раз таки ссылки со слешами и направлять на страницу без слешей. Таким образом текущие страницы проиндексируются как переезжие навсегда, и станут позже доступны по ссылкам без слеша, а новые страницы будут нормально индексироваться без редиректов. Вот код

public function handle($request, Closure $next)
    {

        $url = explode('?', $request->getRequestUri());

        if (isset($url[1])) {
            if (preg_match('/.+\/$/', $url[0])) {
                $base_url = request()->root();
                return Redirect::to($base_url . '/' . request()->route()->uri . '?' . $url[1], 301);
            }
        } else {
            if (preg_match('/.+\/$/', $request->getRequestUri())) {
                $base_url = request()->root();
                return Redirect::to($base_url . '/' . request()->route()->uri, 301);
            }
        }

        return $next($request);
    }
→ Ссылка