Laravel: Imágenes 404 en /storage

Como resolver un problema de imagen en laravel - apache : Síntoma: URL https://dominio/storage/... devuelve 404.

  • Causa: DocumentRoot no apunta a /public, symlink roto o FILESYSTEM_DISK mal.

  • Solución rápida:

    1. APP_URL y disco:

      sed -i 's#^APP_URL=.*#APP_URL=https://dominio#' .env
      sed -i 's#^FILESYSTEM_DISK=.*#FILESYSTEM_DISK=public#' .env
      php artisan config:clear
      
      
    2. Symlink correcto:

      [ -e public/storage ] && [ ! -L public/storage ] && mv public/storage public/storage.bak.$(date +%F-%H%M)
      php artisan storage:link
      
      
    3. Permisos:

      chown -R www:www storage/app/public public/storage
      find storage/app/public -type d -exec chmod 775 {} \;
      find storage/app/public -type f -exec chmod 664 {} \;
      
      
    4. VirtualHost (Apache) → /public:

      DocumentRoot "/ruta/app/public"
      <Directory "/ruta/app/public">
        AllowOverride All
        Require all granted
      </Directory>
      
      

      Recarga: service httpd reload o systemctl reload apache2.

  • Verificación:

    ls -l public/storage
    readlink -f public/storage
    curl -I "https://dominio/storage/carpeta/archivo.png"
    
    
  • Prevención: no crear public/storage a mano; siempre storage:link. Evitar espacios en nombres o usar URL-encoding.


#2 Tema

File Manager sube a /photos/1/test en vez de /photos/1/Productos

Respuesta

  • Síntoma: archivos terminan en .../test/....

  • Causa: working_dir del File Manager apunta a la carpeta equivocada.

  • Solución:

    • Abrir el FM con destino fijo:

      const wd = encodeURIComponent('/photos/1/Productos');
      window.open(`/laravel-filemanager?type=image&working_dir=${wd}`, 'FileManager', 'width=900,height=600');
      
      
    • O con helper:

      $('#lfm').filemanager('image', { prefix:'/laravel-filemanager', working_dir:'/photos/1/Productos' });
      
      
    • Mover lo ya subido:

      rsync -av --remove-source-files storage/app/public/photos/1/test/ storage/app/public/photos/1/Productos/
      
      
  • Verificación: subir una imagen y comprobar URL pública /storage/photos/1/Productos/....


#3 Tema

Directorio público mal configurado en Apache

Respuesta

  • Síntoma: rutas /build y /storage fallan o cargan mal.

  • Causa: VirtualHost apunta al root del proyecto y no a /public.

  • Solución:

    <VirtualHost *:80>
      ServerName dominio
      DocumentRoot "/ruta/app/public"
      <Directory "/ruta/app/public">
        Options FollowSymLinks
        AllowOverride All
        Require all granted
        DirectoryIndex index.php index.html
      </Directory>
      <FilesMatch "\.php$">
        SetHandler "proxy:unix:/tmp/php-cgi-83.sock|fcgi://localhost"
      </FilesMatch>
    </VirtualHost>
    
    

    Recargar Apache.

  • Verificación: curl -I https://dominio/build/manifest.json debe dar 200; imágenes en /storage deben cargar.