ধাপ ১: storage:link লাইভ সার্ভারে চালানো হয়েছে কিনা
লাইভ সার্ভারে SSH/Terminal অ্যাক্সেস থাকলে:
cd /path/to/your/project
php artisan storage:linkএটা public/storage নামে একটা symlink বানায় যেটা storage/app/public-এর সাথে যুক্ত। স্থানীয় সার্ভারে যেমন এই সমস্যা হয়েছিল, লাইভ সার্ভার সেটআপ করার সময় এই কমান্ডটা প্রায়ই ভুলে যাওয়া হয় — এটাই সবচেয়ে সম্ভাব্য কারণ।
ধাপ ২: .env-এ APP_URL চেক করুন
APP_URL=https://10cnumber.comসঠিক আছে কিনা নিশ্চিত করুন (http না, https; www আছে কি নেই সেটাও ডোমেইনের সাথে মিলিয়ে দেখুন), তারপর:
php artisan config:clear
php artisan config:cacheধাপ ৩: ফোল্ডার পারমিশন চেক করুন
লিনাক্সে storage ফোল্ডার ওয়েব সার্ভারের (www-data/nginx) জন্য লিখনযোগ্য (writable) হতে হবে:
chmod -R 755 storage
chown -R www-data:www-data storage(hosting provider ভেদে ইউজার নাম ভিন্ন হতে পারে — cPanel হলে সাধারণত আপনার হোস্টিং ইউজারনেম)
যদি এগুলো কাজ না করে (শেয়ার্ড হোস্টিং-এ symlink কাজ না করাও সাধারণ ঘটনা)
কিছু শেয়ার্ড হোস্টিং (cPanel) নিরাপত্তার কারণে symlink ফাংশন বন্ধ রাখে। সেক্ষেত্রে একটা নিশ্চিত/বুলেটপ্রুফ বিকল্প — symlink-এর উপর নির্ভর না করে সরাসরি Laravel রাউট দিয়ে ফাইল সার্ভ করা।
কোথায় বসাবেন: app/Http/Controllers/StorageFileController.php (নতুন — শুধু symlink কাজ না করলে দরকার হবে)
এটা ব্যবহার করতে হলে routes/web.php-এর একদম উপরে (অন্য সব রাউটের আগে) এই লাইনটা যোগ করুন:
Route::get('/storage/{path}', [App\Http\Controllers\StorageFileController::class, 'show'])->where('path', '.*');⚠️ এটা শুধু তখনই যোগ করবেন যদি ধাপ ১-৩ করার পরও লোগো না দেখায় — কারণ এই ফলব্যাক রুট সিমলিংকের চেয়ে সামান্য স্লো (প্রতি রিকোয়েস্টে PHP-এর মধ্য দিয়ে যায়), তাই আগে storage:link ঠিকভাবে কাজ করানোর চেষ্টা করাই ভালো।
আগে যেটা করবেন: ধাপ ১ (storage:link) চালিয়ে দেখুন কাজ করে কিনা। এটা কাজ না করলে জানাবেন — লাইভ সার্ভারটা কি cPanel/শেয়ার্ড হোস্টিং নাকি VPS (DigitalOcean/AWS ইত্যাদি)? সেটা জানলে আরও নির্দিষ্টভাবে সাহায্য করতে পারব।
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Storage;
class StorageFileController extends Controller
{
/**
* Serves files from storage/app/public directly, without relying on
* the public/storage symlink. Use this as a fallback if storage:link
* doesn't work on your host (some shared hosting disables symlinks).
*/
public function show(string $path)
{
abort_unless(Storage::disk('public')->exists($path), 404);
return Storage::disk('public')->response($path);
}
}
إرسال تعليق