Laravel route без слэшей
сайт недавно был перенесен на laravel, до этого все адреса были вида:
А когда прописали все роуты, адреса начали идти:
Т.е. ларавел убирает все слеши в конце урла. Прошлые адреса все проиндексированы уже поисковиками и если оставить как есть, то боты начнут цеплять новые ссылки без слэша и ругаться на дублирование.
У меня есть первый вариант, настроен 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);
}