Es increíble la cantidad de veces que tuve que buscar en Google, como hacer funcionar storage:link en un shared hosting y no obtener nunca buenos resultados. Cambiar las carpetas de lugares, crear symlinks manual, e incluso mover todo a la carpeta publica fueron algunas de las “soluciones” que tuve la desgracia de probar Después de renegar un buen tiempo, encontré la manera de tener instalado Laravel fuera de public_html y con un symlink funcionando. Y acá te explico los pasos.

Instalación de Laravel

Si todavía no lo hiciste, te invito a que pases por el siguiente enlace: Como instalar Laravel 8? para instalación local. Una vez finalizada la instalación, vamos a explicar brevemente como subir la carpeta al hosting compartido.

Hostings Compartidos / Shared Hosting

Los Hosting Compartidos son realmente económicos, ya que como indica su nombre, estas compartiendo los recursos entre varios usuarios. Para subir Laravel a estos servidores, lo mejor es tener todos los archivos públicos en nuestra carpeta public_html (hosting). Y el resto de la aplicación de Laravel fuera de esta carpeta para que no sea accesible.

Subiendo Laravel al Hosting Compartido

No voy a entrar mucho en detalle sobre esta parte, ya que de esto no se trata el post, pero voy a explicar mas o menos como tengo estructurados mis proyectos de Laravel.

Utilizo GitHub para tener un control de mis versiones de las aplicaciones. De esta manera tengo linkeado el cPanel del Hosting Compartido junto con el proyecto en mi maquina local. Cuando hago cambios, solamente hago un git pull y listo. La carpeta public de mi proyecto, la tengo en public_html del hosting compartido. Mas adelante haré una guía completa para instalar Laravel en Hostings Compartidos.

PHP ARTISAN STORAGE:LINK

Ahora que saben como tengo estructuradas las carpetas, pasemos a la instalación del Storage en public_html. La mayoría de los servidores compartidos nos brindan acceso SSH o incluso dentro del mismo cPanel tenemos acceso a la Terminal de comandos (limitado pero suficiente).

Lo primero que tenemos que hacer es usar el comando de Laravel storage:link para que podamos acceder a las imágenes, videos y archivos desde public_html. Para ello, abrimos la terminal y ejecutamos el siguiente comando:

cd repositories/proyecto && php artisan storage:link

Dentro de ese comando repositories/proyecto deberán cambiarlo a la ubicación en donde este la aplicación de Laravel. Si todo marcha bien les va a salir que el Storage link se realizo correctamente.

Hasta acá, todo bien, ahora empieza lo complicado. Resulta ser que, al tener la carpeta publica en otro directorio (public_html) y no estar utilizando el public de Laravel. El Storage Link se realiza en la carpeta public de nuestra aplicación y no en public_html como debería ser.

Un pequeño truco, que realmente no lo vi en ningún otro lado. Es crear un symlink de otro symlink. ¿Como? con el siguiente comando:

ln -s /home/usuario_hosting/repositories/proyecto/public/storage /home/usuario_hosting/public_html

Lo que estás haciendo con ese comando es copiando la carpeta que te crea el storage:link y replicándola (una segunda vez) en public_html. Recordá cambiar los valores de las rutas de acuerdo a tu usuario y proyecto. La primera parte tiene que ser si o si /public/storage y la segunda /public_html.

Error 404 – Symlink no funcionando

Ok, ya tenemos linkeado nuestro proyecto con el storage de Laravel pero estamos teniendo problemas para encontrar los archivos. Las carpetas estan bien, por lo que el problema radica en otra parte.

Revisando los errores del servidor vamos a encontrar el siguiente error:

Symbolic link not allowed or link target not accessible: /home/usuario_hosting/public_html/storage, referer: https://www.paginaweb.com/

Por mas que intentemos cambiar el .htaccess, chequear que url realmente exista, o incluso eliminar y volver a crear el symlink. Siempre vamos a tener el mismo problema. Y este problema ahora, porque me llevo muchas horas, tiene solución rápida.

El problema del 403, 404, 405 del Storage de Laravel, se debe a un problema con permisos. En donde los nombres de usuarios dueños de las carpetas no son iguales. Hay un comando en Linux que se encarga de dar permisos (no solo de escritura y lectura) a los usuarios. Para solucionar el problema de Laravel Storage 404 en las imágenes (Symlink no funcionando), ejecutamos los últimos comandos en nuestra terminal uno a la vez:

chmod -R o+x /home/usuario_hosting/repositories/proyecto/storage
chmod -R o+x /home/usuario_hosting/repositories/proyecto/public

Ahora si, ya tiene los permisos necesarios para mostrar la carpeta Storage en public_html. Y toda la seguridad de que esa carpeta solamente es modificable por Laravel y sus Controladores.

  • que genio, me funciono. Graciasss

    1. Me alegro! Gracias por comentar tu experiencia.

  • Al usar el comando ‘php artisan storage:link’ me arroja un error:
    symlink(): Permission denied at vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:315

    Intente modificar los permisos al archivo ‘Filesystem.php’ con el comando ‘chmod’ como lo muestra el autor del articulo, pero el problema persiste, también intente cambiando los permisos al directorio”Filesystem.
    ¿Alguien podría ayudarme con este problema?

    1. Hola Erick,
      Pueden ser muchas cosas ese error, asegúrate que la carpeta que tenga permisos sea la de storage no la de vendor. Asegúrate que el proyecto de Laravel lo tengas por fuera de la carpeta public_html, podes seguir esta guía como ayuda para organizar tus archivos. Si tenés acceso al SSH (Terminal) en tu hosting accede a la carpeta Storage con cd y ejecuta “chmod 777 -R”. Si el problema persiste, intenta borrar el cache de toda la aplicacion “php artisan cache:clear” y despues optimizarlo con “php artisan optimize:clear” antes de hacer el link. Esta guia la hice basada en el hosting compartido de Namecheap, son bastantes permisivos para ejecutar comandos.
      Ojala te sirvan estos tips,
      Saludos.

  • Me funciono crack! que maldito genio!, mil gracias!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Etiquetas Relacionadas

Copyright © 2018-2020 Latirus. Todos los Derechos Reservados.