Laravel loyihasini birinchi marta oddiy hostingga yuklagan dasturchilarning ko'pchiligi bir xil holatga duch keladi: barcha fayllar saytning asosiy katalogiga ko'chiriladi, brauzerda esa sahifa o'rniga fayllar ro'yxati, 403 xatosi yoki bo'sh oyna chiqadi. Sababi oddiy: Laravel saytning faqat bitta qismini, ya'ni public papkasini internetga ochiq ko'rishni kutadi. Qolgan hamma narsa, jumladan sozlamalar, kutubxonalar va maxfiy kalitlar, veb-server yetib bora olmaydigan joyda turishi kerak. Ushbu maqolada bu talab nimaga kerakligini va uni oddiy hostingda qanday bajarish mumkinligini bosqichma-bosqich tushuntiramiz.
Nega Laravel faqat public papkani ochiq ko'rishni xohlaydi
Laravel loyihasining ildizida app, config, routes, vendor, storage kabi papkalar va .env fayli joylashgan. Aynan .env faylida ma'lumotlar bazasining paroli, APP_KEY shifrlash kaliti, pochta serverining login-paroli va to'lov tizimlarining maxfiy kalitlari saqlanadi. Saytga keladigan barcha so'rovlar esa public/index.php orqali kirib, freymvork tomonidan qayta ishlanadi. Agar butun loyihani saytning ildiz katalogiga tashlab qo'ysangiz, veb-server .env faylini oddiy matn sifatida berib yuborishi mumkin, bu esa bazangiz va kalitlaringizning to'liq oshkor bo'lishi demakdir. Shuning uchun maqsad bitta: domen ochilganda server to'g'ridan-to'g'ri public papkaga qarashi kerak.
Misol uchun, Toshkentdagi kichik kitob do'koni o'zining misol.uz saytini Laravel'da yozdirgan deylik. Dasturchi loyihani ZIP arxiv qilib, ISPmanager fayl menejeri orqali www/misol.uz papkasiga ochib qo'ydi. Sayt ochilmadi, shoshilib qilingan tuzatish natijasida esa misol.uz/.env manzili brauzerda parollar bilan ko'rinadigan bo'lib qoldi. Quyidagi usullar aynan shunday vaziyatning oldini oladi.
1-usul: hujjat ildizini public papkaga yo'naltirish
Eng toza va tavsiya etiladigan yechim domenning hujjat ildizini (document root) o'zgartirishdir. ISPmanager panelida WWW-domen sozlamalarini ochsangiz, saytning ildiz katalogi ko'rsatilgan maydonni topasiz; panel versiyasiga qarab bu maydon nomi biroz farq qilishi mumkin. Odatda u /var/www/login/data/www/misol.uz ko'rinishida bo'ladi, siz esa oxiriga /public qo'shib saqlaysiz. Shundan keyin loyiha fayllari avvalgidek bitta papkada turadi, lekin internetdan faqat public ichidagi narsalarga murojaat qilish mumkin bo'ladi.
Bu usulning afzalligi shundaki, Laravel o'zi kutgan tuzilmada ishlaydi va hech qanday yo'lni qo'lda tahrirlash kerak emas. php artisan storage:link yaratadigan simvolik havola, Vite yig'gan build fayllari va public/.htaccess ichidagi qayta yozish qoidalari odatdagidek ishlaydi. Agar panelda bu maydon sizga ochiq bo'lmasa, sayt.uz kabinetidan texnik yordamga tiket yozib, hujjat ildizini o'zgartirib berishni so'rashingiz mumkin.
2-usul: ildizdagi .htaccess orqali public papkaga qayta yo'naltirish
Ba'zi hollarda hujjat ildizini o'zgartirish imkoni bo'lmaydi, masalan, bir nechta loyiha bitta katalogni bo'lishganda. Shunda loyiha ildiziga alohida .htaccess fayli qo'yilib, barcha so'rovlar ichki tarzda public papkaga uzatiladi. Brauzer manzilida /public ko'rinmaydi, chunki bu tashqi yo'naltirish emas, Apache ichidagi qayta yozishdir.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
# Qo'shimcha himoya: maxfiy fayllarni to'g'ridan-to'g'ri bermaslik
<FilesMatch "^(\.env.*|composer\.(json|lock)|artisan)$">
Require all denied
</FilesMatch>
Bu usul ishlaydi, ammo u birinchi usulchalik ishonchli emas. Agar kimdir keyinchalik .htaccess faylini o'chirib yuborsa yoki server sozlamasi o'zgarsa, butun loyiha yana ochiq qoladi. Shuning uchun FilesMatch bloki qo'shimcha sug'urta sifatida qo'yilgan. Uni joylagandan so'ng albatta https://misol.uz/.env manzilini ochib ko'ring: 403 yoki 404 xatosi chiqishi kerak, fayl mazmuni esa hech qachon ko'rinmasligi lozim.
3-usul: yadroni veb-katalogdan tashqariga chiqarish
Uchinchi yo'l eng ko'p qo'l mehnati talab qiladi, lekin hujjat ildiziga umuman tegib bo'lmaydigan hostinglarda foydali. Bunda Laravel'ning asosiy qismi uy katalogidagi alohida papkaga, masalan laravel-app ga joylanadi, public ichidagi fayllar esa www/misol.uz ga ko'chiriladi. Keyin index.php ichidagi yo'llar yangi joylashuvga moslab tahrirlanadi. Laravel 11 uchun fayl taxminan quyidagicha bo'ladi:
<?php
use Illuminate\Http\Request;
define('LARAVEL_START', microtime(true));
if (file_exists($maintenance = __DIR__.'/../../laravel-app/storage/framework/maintenance.php')) {
require $maintenance;
}
require __DIR__.'/../../laravel-app/vendor/autoload.php';
$app = require_once __DIR__.'/../../laravel-app/bootstrap/app.php';
$app->usePublicPath(__DIR__);
$app->handleRequest(Request::capture());
usePublicPath qatori muhim: usiz public_path() funksiyasi eski joyni ko'rsatadi va yuklangan rasmlar yoki Vite manifesti topilmaydi. Eski versiyalarda index.php tuzilishi biroz boshqacha, shuning uchun o'z versiyangizdagi asl faylni asos qilib oling va faqat yo'llarni o'zgartiring. Bu usulda storage havolasini ham qayta yaratish kerak bo'ladi, chunki u endi www/misol.uz/storage dan laravel-app/storage/app/public ga ishora qilishi lozim.
Vendor, PHP versiyasi va .env sozlamalari
Ko'p oddiy hostinglarda SSH yoki Composer bo'lmaydi, shuning uchun vendor papkasini o'z kompyuteringizda tayyorlab yuklash qulay. Buni ishlab chiqarish rejimiga mos qilib bajaring, ya'ni test kutubxonalarini qo'shmasdan va avtoyuklovchini optimallashtirib:
composer install --no-dev --optimize-autoloader
npm run build
Hostingdagi PHP versiyasi composer.json talab qilgan versiyadan past bo'lmasligi kerak, aks holda sayt birinchi so'rovdayoq xato beradi. ISPmanager panelida domen uchun PHP versiyasini tanlash mumkin; Laravel 11 kamida PHP 8.2 talab qiladi. .env faylida esa quyidagi qiymatlarni tekshiring:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://misol.uz
DB_CONNECTION=mysql
DB_HOST=localhost
DB_DATABASE=login_shop
DB_USERNAME=login_shop
DB_PASSWORD=kuchli-parol
APP_DEBUG=false ayniqsa muhim. Agar u true bo'lib qolsa, istalgan xato sahifasida fayl yo'llari, so'rov parametrlari va ba'zan muhit o'zgaruvchilari ko'rinib qoladi.
Ruxsatlar, kesh va yakuniy tekshiruv
Laravel storage va bootstrap/cache papkalariga yozish imkoniga ega bo'lishi shart, aks holda log, sessiya va kompilyatsiya qilingan shablonlar saqlanmaydi. Odatda papkalar uchun 755, fayllar uchun 644 ruxsati yetarli, chunki hostingda PHP sizning foydalanuvchingiz nomidan ishlaydi; 777 qo'yish shart emas va xavfli. SSH mavjud bo'lsa, joylashdan keyin keshlarni yangilab qo'ying:
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
Shuni yodda tutingki, config:cache dan keyin env() funksiyasi faqat config fayllari ichida ishlaydi, kontroller yoki shablonda to'g'ridan-to'g'ri chaqirilsa, null qaytaradi. Oxirida uchta narsani tekshiring: bosh sahifa ochilyaptimi, /.env manzili yopiqmi va rasmlar hamda CSS fayllari to'g'ri yuklanyaptimi.