Storage files 404: public/storage symlink missing Laravel Origin: Application & API Last updated 4 Nov 2026

Laravel: 404 for /storage/file.jpg — symlink(): No such file or directory / The [public/storage] link already exists

Uploaded files stored in storage/app/public aren't reachable because the public/storage symlink doesn't exist or points to the wrong place.

Exact message you may see The [public/storage] link already existssymlink(): No such file or directory storage:linkERROR The [public/storage] link already exists.storage link 404 Laravel images not showingsymlink(): Protocol error
Seen on: Laravel PHP Linux

Meaning

Run php artisan storage:link on each environment (it isn't committed). If the link already exists but is broken (moved server/path), delete it and recreate. On shared hosting without shell, create the link via a route or copy files; on Windows needs privileges.

Common causes

  • storage:link never run on this server
  • Broken symlink after moving the project
  • FILESYSTEM_DISK/APP_URL mismatch
  • Symlinks disabled on the host
  • Public folder deployed separately

⚡ Quick fix

  1. php artisan storage:link
  2. If it exists: rm public/storage && php artisan storage:link
  3. Set APP_URL correctly for generated URLs

Detailed fix by platform

Laravel

  1. ls -l public/ | grep storage && php artisan storage:link

How to diagnose

  1. Link — public/storage exists and resolves?
  2. Disk — public disk used?
  3. URL — APP_URL correct?

🔧 Still not fixed?

Many errors look alike. If the steps above didn’t solve it, one of these is probably what you’re facing:

Where this error sits

Origin: Application & API. Errors that are often confused with or caused by this one (click to open):

1114 — MySQL ERROR 1114 (HY000): The table 'x' is full (MySQL)1114126 incorrect key file — MySQL ERROR 126 (HY000): Incorrect key file for table; try to repair it (MySQL)126 incorrect key file403 This action is unauthorized — Laravel: Illuminate\Auth\Access\AuthorizationException: This action is unauthorized. (Laravel)403 This action is un…404 on all routes except home (public folder / .htaccess) — Laravel on shared hosting: homepage works but every other route returns 404 Not Found (Laravel)404 on all routes exc…Attempt to read property "x" on null — Laravel/PHP 8: ErrorException: Attempt to read property "name" on null (Laravel)Attempt to read prope…Command "x" is not defined — Laravel: Symfony\Component\Console\Exception\CommandNotFoundException: Command "make:livewire" is not defined. Did you mean one of these? (Laravel)Command "x" is not de…env() returns null (config cached) — Laravel: .env changes ignored / env('X') returns null after php artisan config:cache (Laravel)env() returns null (c…Laravel storage — Laravel: The stream or file "storage/logs/laravel.log" could not be opened in append mode: Failed to open stream: Permission denied (PHP)Laravel storageStorage f…

Explore the map of this error Full error map →

🧠 Still stuck? Analyze your error

Paste the full message, response headers or stack trace — we'll detect the platform and point to the most likely cause.

💬 What worked for others

No tips yet — did something else fix this for you?

Share what worked for you

Tips are checked by an editor before they appear. Links are removed.