Laravel дублирование ссылки с /public и без (мое решение)

Рейтинг: 0Ответов: 1Опубликовано: 28.07.2023

На продакшене недавно в вебмастере заметил что начали дублироваться ссылки:

Основная ссылка (пример): https://domain.ru/category/product/id

Ссылка дубль: https://domain.ru/public/category/product/id

При чем на локальном вторая ссылка сразу падает в 404, а на продакшене открывается как ни в чем не бывало, показывая контент как и в основной ссылке, совершенно без ошибок.

Гуглил, сразу убрал вариант с перемещением файла index.php в корень проекта. Вариант с изменением .htaccess мне вообще не помог.

Но я решил это так:

Ответы

▲ -1

Создаем middleware: php artisan make:middleware PublicMiddle

Прописываем его в app/Http/Kernel.php:

protected $middlewareAliases = [
    ...

    'ispublic' => \App\Http\Middleware\PublicMiddle::class,
]

И в routes/web.php добавляем в группу:

Route::middleware(['ispublic'])->group(
    function () {
    // Ваши url
});

В созданном middleware app/Http/Middleware/PublicMiddle.php прописываем код:

    /* Разбиваем текущий url по домену, чтобы получить правую часть от него
        $explodedUrl = [
            'https://',
            '/public/category/product/id'
        ]
    */
    $explodedUrl = explode('domain.ru', $request->url());

    if (isset($explodedUrl[1])) {
        // Если url разбился по домену, то правую часть ([1]) разбиваем по /
        $urlArr = explode('/', $explodedUrl[1]);
    }

    // [0] будет пустой, поэтому если [1] равен public, то выкидываем 404
    if (isset($urlArr[1]) && $urlArr[1] == 'public') {
        abort(404);
    }

    return $next($request);

Таким образом каждый url из вашего web.php будет проверятся на наличие в начале сразу после домена /public.