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

По-умолчанию главную страницу можно открыть несколькими способами:
http://yoursite.loc
http://yoursite.loc/public
http://yoursite.loc/public/index.php


а остальные страницы, например «services» так:
http://yoursite.loc/services
http://yoursite.loc/public/services
http://yoursite.loc/public/index.php/services


То есть дубли с public и public/index.php могут встраиваться в URL любой страницы сайта.


404.jpgЧто бы убрать данные дубли, добавляем в файл app/Providers/RouteServiceProvider.php в метод boot():
public function boot()
{
    /*
     * Убираем дубли страниц, сервер выдаст ошибку 404 или Not Found
     * Проверка URL на содержание /public/ или /public/index.php
     */
    if (preg_match("/^\/public/", \Request::getBaseUrl()) ) { 
        abort(404);
    }

    parent::boot();
}
В результате сервер вернет ошибку 404 (Not Found), такую же как если пользователь перейдет по любой несуществующей ссылке.



Ошибка 301
Как вариант, можно вместо этого сделать перенаправление на запрашиваемую страницу но уже с нормальным URI:
if (preg_match("/^\/(public)|(public\/index.php)/",\Request::getBaseUrl()) ) {
    
    $newUrl = str_replace(\Request::getBaseUrl(), '', \Request::getUri());
    header('Location: '.$newUrl, true, 301);
    exit();

}

Так же, данный код, вместо класса сервис-провайдера можно поместить в методе __construct() основного контролера (от которого наследуют дочерние).