Прежде чем мы начнем, стоит дополнить этот пост сообщением: Всегда более желательно и рекомендуется обслуживать приложения Laravel из специальной среды хостинга .
Есть из чего выбирать, начиная с инструментов первой партии, таких как Forge и Vapour для более общих поставщиков, таких как DigitalOcean , AWS и GCP .
Однако, поскольку я нахожусь в аналогичной ситуации, могут возникнуть ситуации, когда вам придется развертываться в среде cPanel.
Я собираюсь рассказать об обычном довольно простом перенаправлении, которое вы видите в Интернете, но, что более важно, о втором шаге, который обычно не учитывается. Этот второй шаг может оказать огромное влияние на ваш SEO.
Перенаправление
Как вы, возможно, нашли в другом месте, есть простое перенаправление, которое вы можете поместить в корневую папку вашего проекта:
# Internally rewrite all top-level requests to the public directoryRewriteEngine On RewriteRule ^(.*)$ public/$1 [L]
Это очень просто и просто перенаправляет все из корня вашего сайта public_html вниз в папку public вашего проекта Laravel.
Оттуда .htaccess , предоставляемый Laravel, будет принимать и маршрутизировать входящие запросы.
Работа выполнена? Может быть, и нет…
Проблема SEO
Проблема с вышеуказанным перенаправлением заключается в том, что оно не предотвращает доступ ко ВСЕМ вашим URL-адресам с префиксом /public/ . Так что оба / и /общедоступный/ будет обслуживать домашнюю страницу ваших приложений!
Это, очевидно, плохо сказывается на любых усилиях по SEO, которые вы планируете предпринять на сайте, так как теперь у вас есть дубликаты страниц, и, кроме того, если кто-то наткнется на эти URL-адреса, это не очень хорошо для пользователей.
Я потратил некоторое время, пробуя перенаправления, чтобы предотвратить это от Сам файл .htaccess , но оказался пустым. В моем конкретном случае это сервер cPanel с установленным Litespeed. И я знаю по опыту, что это не совсем на 100% похоже на Apache.
Решение
Поскольку подход .htaccess оказался пустым, я выбрал решение для промежуточного программного обеспечения. Опять же, это не идеально, так как на самом деле это не ответственность приложений но мы все равно не в идеальной ситуации.
Это довольно простое промежуточное программное обеспечение, оно ищет общедоступный префикс и возвращает перенаправление 301, если найдено. Это означает, что у вас не может быть URL-адресов, начинающихся с public, но в нашем случае это не было проблемой:
getRequestUri(), '/public') === 0) {
return redirect()
->to($request->getSchemeAndHttpHost() . '/' . substr($request->getRequestUri(), 8))
->setStatusCode(301);
}
return $next($request);
}
}
Опять же, это не идеально, но подходит для наших целей.
Добавьте это в свой глобальный стек промежуточного программного обеспечения, прежде чем что-либо еще.
Обратите внимание, как мы используем метод $request->getRequestUri() , а не просто $request->путь() . Поскольку путь будет зависеть от перезаписи серверов.
Теперь любые запросы на public будут перенаправляться с помощью 301, и вы не будете обслуживать дублирующиеся страницы.
Оригинал: “https://dev.to/leemason/laravel-on-shared-hosting-51g2”