Порою вам просто необходимо воспрользоваться виртуальным хостингом. Причины могут быть в клиенте или в политике компании. Несмотря на это Laravel структурирован особым образом и мы рассмотрим несколько способов, которые помогут нам разместить проект на хостинге с минимальными требованиями.
Я хотел бы начать с того , что существуют много решений способных удовлетворить ваши потребности — готовые решения для размещения проектов на таких PHP фреймворках, как Laravel. Fortrabbit — одно из таких решений, но безусловно не единственное.
Помните, что абсолютный минимум требований включает в себя расширение PHP Mcrypt. Мы будем использовать следующую структуру папок в качестве базовой для этого урока — www папка является нашим DoceumntRoot. Ваша структура папок на вашем хостинге может отличаться.
1 2 3 |
config/ logs/ www/ |
Спасибо следующим ресурсам и людям:
- Laravel 4 — Easily Extended by Rob Clancy
- Laravel 4 in Shared Hosting by Mior Muhammad Zaki
- Understanding the Laravel PUBLIC folder by Shawn McCool
Нет доступа к DocumentRoot
DocumentRoot — это папка куда смотрит ваш домен на хостинге. Laravel требует смотреть в папку public, чтобы ваше основное приложение было недоступно извне. Но что, если вы не можите сопоствить свой домен с папкой public Laravel? Сам виртуальный хостинг не предоставляет такой возможности. Есть несколько способов решить эту проблему и один лучше другого:
1. Переименовать папку public
Если ваш хостинг позволяет управлять фаловой системой на уровень выше DocumentRoot, но должно быть специфическое название папки, то можно использовать эту фозможность для получения желаемого результата.
Для начала созданим папку с именем laravel
на нашем хостинге и выложим туда структуру приложения.
1 2 3 4 5 6 7 8 |
config/ laravel/ app/ bootstrap/ vendor/ ... logs/ www/ |
Затем загрузим содержимое папки public в папку www.
1 2 3 4 5 6 7 8 9 10 11 12 |
config/ laravel/ app/ bootstrap/ vendor/ ... logs/ www/ packages/ .htaccess index.php ... |
Теперь, когда мы изменили местоположение и имя папки public, мы должны отразить это в файле bootstrap/paths.php
.
1 2 3 4 5 |
# Изменим эту строку... 'public' => __DIR__.'/../public', # ... на эту. 'public' => __DIR__.'/../../www', |
Мы также должны изменить пути в файле www/index.php
, чтобы найти новую папук laravel
.
1 2 3 4 5 6 7 |
# Заменим эти две строки... require __DIR__.'/../bootstrap/autoload.php'; $app = require_once __DIR__.'/../bootstrap/start.php'; # ... на эти. require __DIR__.'/../laravel/bootstrap/autoload.php'; $app = require_once __DIR__.'/../laravel/bootstrap/start.php'; |
Вот мы и переместили успешно папку public и наше laravel приложение. Вы можете конечно загрузить приложение laravel в корневую папку, но в отдельной папке это выглядит более практично.
Еще один способ — создать символическую ссылку к папке public в папке www, но мало вероятно, что у вас есть доступ к этой функции на виртуальном хостинге.
2. Использовать .htaccess и mod_rewrite
Прежде чем мы продолжим, хотелось бы отметить, что следующий способ очень не рекомендуется использовать. Перемещая все приложение в DocementRoot вы подвергаете свое приложение опасности, которая оставляет уязвимость для атак злоумышленников. В этот момент вы должны серьезно задуматься над сменой хостинга, который больше подходит для размещения PHP фреймворков как Laravel.
Порою вы ползуетесь определенным хостинго из-за клиентов или других причин. В отличие от предыдущего метода, мы собираемся загрузить фреймворк в папку DocementRoot. Мы собираемся использовать .htaccess в нашу прользу, чтобы перенаправить все запросы в общую папку.
Для начала переместим все приложение в папку www.
1 2 3 4 5 6 7 8 9 10 11 12 |
config/ logs/ www/ app/ bootstrap/ public/ packages/ .htaccess index.php ... vendor/ ... |
Теперь в папки www, разместите файл .htaccess со следующим содержимым.
1 2 3 4 5 |
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_URI} !^public RewriteRule ^(.*)$ public/$1 [L] </IfModule> |
Это должно перенаправить все запросы к вашемей папке public. Запросы к вашей папке public, например файлы статики, будут по-прежнему приниматься.
3. Переместить все в DocumentRoot
Так же, как в предыдущем методе мы переместим все приложение в папку DocumentRoot. Но на этот раз мы также и сожержимое папки public в DocumentRoot
Во-первых, давайте перестим все приложение в папку www (DocumentRoot).
1 2 3 4 5 6 7 8 9 10 11 12 |
config/ logs/ www/ app/ bootstrap/ public/ packages/ .htaccess index.php ... vendor/ ... |
Теперь переместим содержимое папки public в DocumentRoot и удалим её.
1 2 3 4 5 6 7 8 9 10 |
config/ logs/ www/ app/ bootstrap/ packages/ vendor/ .htaccess index.php ... |
Придется изменить путь в файле bootstrap/paths.php.
1 2 3 4 5 |
# Изменим это... 'public' => __DIR__.'/../public', # ... на это. 'public' => __DIR__.'/..', |
И наконец мы должны также изменить пути в файле index.php.
1 2 3 4 5 6 7 |
# Изменим эти две строки... require __DIR__.'/../bootstrap/autoload.php'; $app = require_once __DIR__.'/../bootstrap/start.php'; # ... на эти. require __DIR__.'/bootstrap/autoload.php'; $app = require_once __DIR__.'/bootstrap/start.php'; |
Теперь ваше Laravel приложение должно работать.
Деградация до PHP 5.3.2
Laravel 4 требует по крайней мере PHP 5.3.7 из-за Bcrypt, но есть способ дергадировать до PHP 5.3.2, если вы застряли с этим. Роб Клэнси (Rob Clancy) написал подробную инструкцию о том, как понизить до абсолютного минимума требования к версии PHP.
Нет доступа к SSH
Сам виртуальный хостинг не предлагает поддержку системы контроля версий, так что ваши варианты развертывания ограничены FTP. Очевидно, что это проблема, потому что размертывание настроятельно не рекомендуется через FTP. Какие файлы были отредактированы, какие должны быть загружены? Что делать, если я случайно перезаписал важные данные?
К счастью есть несколько средств развертывания, которые могут вам помочь в этом. Приведу некоторые из них.
Отсутствие доступа к SSH также означает отсутствие доступа к composer, artisan и другим инструментам командной строки. И снова FTP, вероятно, твой единственный друг. Если вы решили не использовать средства развертывания, то я рекомендую делать по крайней мере слудующее.
Запускайте composer install с аргументом —no-dev перед заргузкой файлов. Это оптимизирует ваши зависимости для продакшена без ненужных зависимостей предназначенных для разработки. И перезаписывайте папку vendor с обновленными зависимостями, когда вы загружаете файлы через FTP.
Вывод
Я надеюсь, что некоторые из описанных советом помогут вам в установке приолжения на Laravel 4 на вашем виртуальном хостинге. Если у вас есть дополнительные советы, то пожалуйста делитись или в комментариях и я дополню ими пост.