Коротко: Для Laravel 5 нужен PHP 5.5.9+. На shared хостинге без SSH - положите все файлы Laravel в подпапку laravel/, а в корне сайта разместите .htaccess и index.php которые перенаправляют запросы в laravel/public/. Переменные окружения читайте из .env файла (не из переменных сервера).
Проблема: Структура директорий на shared хостинге
На большинстве хостингов в КР в 2015 году (INFOCOM, Aknet hosting, Elcat):
- Корень сайта:
/public_html/или/www/ - PHP 5.3 по умолчанию, 5.5 доступен через
.htaccess - SSH часто отсутствует
- Composer запустить нельзя - устанавливаем локально, загружаем vendor/ через FTP
Структура файлов
/public_html/ ← Корень вашего домена
├── .htaccess ← Перенаправляет в laravel/public/
├── index.php ← Перенаправляет в laravel/public/
└── laravel/ ← Весь Laravel здесь
├── app/
├── bootstrap/
├── config/
├── database/
├── public/ ← Публичные файлы (assets, index.php)
├── resources/
├── routes/ (в L5: app/Http/routes.php)
├── storage/
├── vendor/
└── .env
/public_html/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
# Указать PHP версию 5.5 (синтаксис зависит от хостинга)
AddHandler application/x-httpd-php55 .php
# Все запросы → laravel/public/
RewriteCond %{REQUEST_URI} !^/laravel/public/
RewriteRule ^(.*)$ laravel/public/$1 [L]
</IfModule>
/public_html/index.php
<?php
// Резервный вариант если mod_rewrite не работает
// (некоторые shared хостинги отключают AllowOverride)
define('LARAVEL_START', microtime(true));
// Перенаправить все запросы в laravel/public/index.php
require __DIR__ . '/laravel/public/index.php';
/public_html/laravel/public/.htaccess (модифицированный)
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
# Указать PHP 5.5
AddHandler application/x-httpd-php55 .php
# Обрабатывать авторизационные заголовки
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Редирект trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Front controller
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
.env файл для производства
# /public_html/laravel/.env
# НЕ загружать в git!
APP_ENV=production
APP_DEBUG=false
APP_KEY=base64:your-random-32-char-key-here
APP_URL=https://mysite.kg
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=mysite_db
DB_USERNAME=mysite_user
DB_PASSWORD=strong_password
CACHE_DRIVER=file
# На shared хостинге Redis недоступен - используем файловый кэш
# Убедитесь что storage/framework/cache/ доступна для записи
SESSION_DRIVER=file
# Аналогично: файловые сессии на shared хостинге
MAIL_DRIVER=smtp
MAIL_HOST=mail.aknet.kg
MAIL_PORT=587
MAIL_USERNAME=noreply@mysite.kg
MAIL_PASSWORD=mail_password
MAIL_FROM_ADDRESS=noreply@mysite.kg
MAIL_FROM_NAME="Мой Сайт"
Загрузка через FTP (без SSH)
# Локально: установить зависимости
composer install --no-dev --optimize-autoloader
# Генерировать ключ приложения локально
php artisan key:generate
# Оптимизировать для производства
php artisan config:cache # Кэширует config/*.php в один файл
php artisan route:cache # Кэширует routes
# НЕ делайте view:cache на shared хостинге - пути могут отличаться
# Загрузить по FTP:
# ✓ app/
# ✓ bootstrap/
# ✓ config/
# ✓ database/
# ✓ public/
# ✓ resources/
# ✓ routes/ (app/Http/routes.php для L5.0)
# ✓ vendor/ ← самая большая папка, ~20-30 МБ
# ✗ НЕ загружать: .git/, tests/, node_modules/
Права доступа к storage/
# На shared хостинге через файловый менеджер хостинга:
# storage/ → 755 (папки) и 644 (файлы)
# bootstrap/cache/ → 755
# Или через PHP (если есть выполнение скриптов):
<?php
$dirs = [
__DIR__ . '/../storage/app',
__DIR__ . '/../storage/app/public',
__DIR__ . '/../storage/framework/cache',
__DIR__ . '/../storage/framework/sessions',
__DIR__ . '/../storage/framework/views',
__DIR__ . '/../storage/logs',
__DIR__ . '/../bootstrap/cache',
];
foreach ($dirs as $dir) {
if (!is_dir($dir)) mkdir($dir, 0755, true);
chmod($dir, 0755);
}
echo "Права установлены\n";
Типичные ошибки при деплое на shared хостинг
Ошибка: "No application encryption key has been specified"
# .env файл не загружен или APP_KEY пустой
# Решение: php artisan key:generate локально, скопировать результат в .env
APP_KEY=base64:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
Ошибка: PHP Fatal error - требуется PHP >= 5.5.9
# .htaccess - синтаксис для разных хостингов:
# Вариант 1 (cPanel):
AddHandler application/x-httpd-php55 .php
# Вариант 2 (альтернативный):
php_flag short_open_tag off
# Вариант 3 - через php.ini в корне:
# Создать файл php.ini с содержимым:
# php_value[date.timezone] = Asia/Bishkek
Ошибка: Страница медленно загружается (3+ секунды)
// На shared хостинге php artisan config:cache критичен
// Без него Laravel читает все config/*.php на каждый запрос
// bootstrap/app.php - добавить если кэш не работает:
$app->singleton(
Illuminate\Contracts\Http\Kernel::class,
App\Http\Kernel::class
);
С описанной настройкой Laravel 5 работал на shared хостинге. Производительность была скромной - ~200ms на страницу без кэша - но для малого бизнеса в Бишкеке этого хватало.