По-умолчанию главную страницу можно открыть несколькими способами:
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 любой страницы сайта.

public function boot() { /* * Убираем дубли страниц, сервер выдаст ошибку 404 или Not Found * Проверка URL на содержание /public/ или /public/index.php */ if (preg_match("/^\/public/", \Request::getBaseUrl()) ) { abort(404); } parent::boot(); }В результате сервер вернет ошибку 404 (Not Found), такую же как если пользователь перейдет по любой несуществующей ссылке.

Как вариант, можно вместо этого сделать перенаправление на запрашиваемую страницу но уже с нормальным URI:
if (preg_match("/^\/(public)|(public\/index.php)/",\Request::getBaseUrl()) ) { $newUrl = str_replace(\Request::getBaseUrl(), '', \Request::getUri()); header('Location: '.$newUrl, true, 301); exit(); }
Так же, данный код, вместо класса сервис-провайдера можно поместить в методе __construct() основного контролера (от которого наследуют дочерние).
if (preg_match("/public/",\Request::getBaseUrl()) ) {
abort(404);
}
ответ на комментарий Андрей от 02.11.2017
http://yoursite.loc/index.php
все равно не отработает, а значит да, можно убрать «index.php».
Но лучше уже так:
тогда будет найдено не просто «public» в любом месте строки возвращаемой Request::getBaseUrl(), а «/public» и только в начале Url, а не в любом ее месте.
Правда это можно сделать только для первого варианта с ошибкой 404. В заметке поменяю.
ответ на комментарий Сергей от 02.11.2017
ответ на комментарий Павел от 25.01.2018