শেয়ার্ড হোস্টিং-এ symlink কাজ না করাও সাধারণ ঘটনা

 

ধাপ ১: 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-এর একদম উপরে (অন্য সব রাউটের আগে) এই লাইনটা যোগ করুন:

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);

    }

}









Post a Comment

Previous Post Next Post