Remover segmento ‘/public’ de la URL en Laravel

Cuando se empieza con un proyecto en Laravel por defecto el segmento ‘public’ de la URL es visible. A nivel de desarrollo puede que no moleste mucho – en mi caso sí me molesta -, pero cuando ya queremos montar nuestra aplicación y lanzarla al mundo obviamente no queremos ‘public’ esté ahí.

En primera instancia tenemos que entender que contiene el directorio ‘public‘ de Laravel. Como bien dice su nombre, contiene todo lo público de la aplicación – al que el navegador tendrá acceso -: hojas de estilo, javascript, imágenes, fuentes, favicon. En resumidas cuentas son los conocidos assets. Pero dentro de este directorio también deben ir los archivos: robots.txt, humans.txt, mapas del sitio y archivos públicos de descarga. Finalmente se encuentra el archivo index.php el que se encarga de arrancar el framwork.

A continuación voy a explicar dos formas de poder ocultar el segmento ‘/public’ de la URL. Pueden ser utilizadas tanto a nivel local como en producción.

CREANDO UN LINK SIMBÓLICO

Esta es la opción más recomendada debido a que es la más simple, sin tener que tocar código alguno. Al mismo tiempo, entrega seguridad – y es la que la comunidad recomienda – debido a que oculta del acceso público los archivos propios del framwork y sólo deja la carpeta ‘public’ como accesible.

Lo que vamos a hacer es tener nuestra carpeta de Laravel fuera de alcance público y vamos a crear un link a la carpeta pública /public. Por ejemplo, vamos a tener el framework en /algun/lugar/del/disco/laravel y vamos a crear un link simbólico para que al momento de acceder desde el navegador, el servidor obtenga los datos desde /algun/lugar/del/disco/laravel/public.

  1. Descarguen e instalen Laravel fuera del directorio web público – fuera de public_html, www o htdocs -. Puede ser en cualquier lugar, pero yo recomiendo utilizar un nivel más arriba del directorio web público.
  2. El siguiente paso es crear el link simbólico.
    • Windows
      Vamos a suponer que trabajan con XAMPP y que tienen instalado Laravel en C:\xampp\framework-laravel.

      1. Abran una consola como Administrador – importante -.
      2. Vayan al directorio web público:
        cd C:\xampp\htdocs
      3. Luego escriban el siguiente comando:
        mklink /d laravel C:\xampp\framework-laravel\public
    • Linux
      Vamos a suponer que trabajan con LAMPP y que tienen instalado Laravel en /opt/lampp/framework-laravel. En la consola deben escribir:

      ln -s /opt/lampp/framework-laravel/public /opt/lampp/htdocs/laravel
  3. Ahora ya podemos acceder a http://localhost/laravel. Ahora esa ruta hace referencia a la carpeta ‘public’  de Laravel. El nombre que le dimos al link es laravel – justo despues de /d en Windows y la última ruta en Linux – pero pueden ocupar el que ustedes deseen, como el nombre del proyecto en el cual trabajan.Para remover el link sólo deben remover el archivo creado que se encuentra en la carpeta web pública.

OCULTANDO EL FRAMEWORK Y DEJANDO /PUBLIC SEPARADO

Al igual que la opción anterior, también ocultaremos el framework del acceso publico, pero dejaremos la carpeta ‘public‘ en la carpeta web pública – public_html, www o htdocs – y lo ‘feo’ de todo esto, es que hay que meter un poco de mano al código, veamos:

  1. Descarguen e instalen Laravel fuera del directorio web público – fuera de public_htmlwww o htdocs -. Puede ser en cualquier lugar, pero yo recomiendo utilizar un nivel más arriba del directorio web público. En este ejemplo quedará así nombrando la carpeta como laravel-framework:
    cgi-bin/
    error_log/
    public_html/
        ...
    laravel-framework/
        app/
        bootstrap/
        vendor/
        artisan
        server.php
        ...
    otra_carpeta/
    otra_mas/
    ...
    
  2. Creen una carpeta con el nombre de su proyecto en la carpeta web pública. En este caso utilizaremos el nombre mi-proyecto:
    cgi-bin/
    error_log/
    public_html/
        mi-proyecto/
           ...
        ...
    laravel-framework/
    otra/
    otra_mas/
    ...
    
  3. El contenidopublic‘ del framework debe ir en la carpeta mi-proyecto que creamos.
  4. Una vez copiado el contenido, deben abrir y editar el archivo index.php.
  5. Deben encontrar las siguientes líneas:
    require __DIR__.'/../bootstrap/autoload.php';
    $app = require_once __DIR__.'/../bootstrap/start.php';

    Esas rutas hacen referencia a la carpeta boostrap de Laravel, por lo cual debemos modificarlas para que index.php pueda arrancar el framework. Como pusimos el framework dentro de la carpeta laravel-framework, las rutas deben quedar de esta manera:

    require __DIR__.'/../../laravel-framework/bootstrap/autoload.php';
    $app = require_once __DIR__.'/../../laravel-framework/bootstrap/start.php';
  6. Ahora tienen que ir a archivo paths.php ubicado en laravel-framework/boostrap y editar el path de public, quedando así:
    // El valor de la carpeta puede tomar tanto como public_html, www, htdocs o cualquier otro nombre dependiendo del servidor
    'public' => __DIR__.'/../../public_html/mi-proyecto',
  7. Ahora ya podemos acceder a http://localhost/laravel.

Esta opción es recomendada para hosting compartidos en los cuales por ejemplo no tienen acceso SSH como para crear un link simbólico. Lo bueno es que aún así ocultan el framework del acceso público – fuera de la carpeta web pública – y sólo dejan a la vista sólo lo que debe estar.

Si llegan a utilizar packages que generen archivos en el directorio ‘public‘ del framework, se van a generar en la carpeta laravel-framework creando una nueva carpeta ‘public‘ con los archivos generados – no lo he probado pero así debería funcionar -. Si desean cambiar la ruta en donde se generan esos archivos, hay que cambiar el valor de public en el archivo boostrap/paths.php.

LO NO RECOMENDADO

Existe una tercera opción que no voy a detallar, pero consiste en juntar el directorio ‘public’ con la raíz de Laravel, de esa manera el directorio desparece y en su defecto la URL también. No lo detallo ya que es un método sucio y poco seguro, estaríamos dejando al acceso publico los archivos del framework y no es lo recomendado.

ACTUALIZACIÓN (31/07/2013): otro método válido para poder ocultar el directorio ‘public en un hosting compartido es generar un sub-dominio y apuntarlo a la carpeta ‘public’ de Laravel.

ACTUALIZACIÓN (20/01/2014): se agregó un paso más al momento de ocultar el framework y dejando ‘public’ por separado y se documentó con mayor detalle.

39 comentarios sobre “Remover segmento ‘/public’ de la URL en Laravel

  1. Hola, En mi caso me gusta la carpeta public en Laravel 4. Pues en algunos casos es conveniente mover la carpeta views al public. Ejemplo: Imagínate que estas trabajando con javascript y que estas trabajando con mustache.js en el front y también con mustache.php del lado del servidor. Puedes utilizar las mismas plantillas en ambos lenguajes y te ahorras tener que duplicar código! Bueno esa es una de las muchísimas utilidades que hay. También porque la carpeta views es completamente inaccesible y muchas veces no queremos depender de las rutas y controladores de laravel para acceder vistas… ;) Es cuestión de gustos!! Un saludo!!

    Me gusta

    1. Efectivamente sería buena opción tener la carpeta ‘views’ en ‘public’ en el caso de trabajar con un motor de plantilla JS y quererlas ocupar en el servidor. Pero en esta guía la verdad lo que realizo es ocultar el segmento ‘public’ de la URL y en ningún caso remuevo la carpeta, por lo que aún así puedes hacer lo que comentas.

      También puedes hacer alguna regla del .htaccess para acceder de manera pública la carpeta ‘views’ dentro de ‘app’, pero eso ya es otro tema y hasta conviene más moverlas a ‘public’.

      Gracias por tu comentario.

      Me gusta

      1. Hola, creo que es un poco tarde para responder a esto, pero igual lo haré.
        La versión que estoy utilizando ahorita es la 5.1.4, y el problema que se tiene con los archivos css y js se pueden solucionar utilizando el package laravel\Collective de esta forma, el package añade un facade a la aplicación para poder referenciar los archivos del front-end

        Me gusta

  2. Si en mi hosting tengo mi carpeta public_html como hago para que al entrar a http://www.midominio.com entre en la carpeta de public de laravel? no se si me explique bien, no quiero usar un subdominio, ni tampoco una carpeta del tipo http://www.midomino.com/laravel pero tampoco me gustaria juntar la carpeta public en la raíz del sitio por las cosas antes ya mencionadas en el post, habra algúna manera? esto seria en un servidor compartido. Muchas Gracias desde ya.

    Me gusta

    1. Sigue los pasos de «OCULTANDO EL FRAMEWORK Y DEJANDO /PUBLIC SEPARADO». La idea es dejar la carpeta /public del framework en tu carpeta public_html y claro, tendrás que cambiar algunas rutas del archivo index.php. Ahora, si no quieres modificar nada, puedes crear una carpeta dentro de public_html, quedando algo como public_html/laravel y en el panel de tu hosting apuntar el dominio a esa carpeta, en vez de a la carpeta raíz pública. No sé si me explico :P. También podrías hacerlo con una regla .htaccess: https://support.lunarpages.com/knowledge_bases/article/549

      Cualquier duda puedes visitar http://laraveles.com y de seguro te ayudamos entre todos.

      Me gusta

      1. Lo que hice fue poner la carpeta public en public_html y las demas una mas arriba, donde estas otras carpetas como ssl, mail, etc, me esta funcionando sin problemas, ahora ya con esto brindo seguridad? debe agregarle permisos especiales a las carpetas de laravel para mas seguridad? como sería los permisos? la verdad soy nuevo en lo que es ya montando una aplicacion en producción, asi que no conoszco mucho los temas de seguridad en el hosting, aunque leo mucho, capaz y se me pasa algo simple que deba hacer, muchas gracias.

        Me gusta

        1. Con eso debería bastar :). La carpeta de Laravel debería estar con permisos 755, lo típico, y ya el sólo hecho de que la carpeta no esté en la carpeta web pública agregas una capa de seguridad.

          Me gusta

    1. También es una opción válida cuando tienes un acceso más administrativo en el servidor que estás trabajando. Es más, es la opción que yo utilizo en mis servidores.

      Me gusta

      1. El tiempo no existe se lo hace uno,y me refiero a como evitar la carpeta public yo ya postie 2 métodos en la comunidad y pienso q ayudas mas con un vídeo q escribiendolo

        Me gusta

  3. Bueno logre solucionar el problema, no puedo eliminar el comentario, mi duda es la siguiente:
    He creado la carpeta «laravel-framework» fuera de htdocs, si deseo trabajar en otros proyectos con laravel, tendre que crear otras carpetas fuera de htdocs y crear su respectivo enlace simbolico ?

    Me gusta

  4. Hola, he realizado los pasos necesarios para remover el segmento public, y todo funciona bien, excepto, al momento de subir una imagen, se supone que lo debería almacenar en la carpeta public, pero ya no almacena nada, los datos lo registra en la base de datos y todo, pero el archivo no es almacenado en el servidor, alguno le ha pasado esto, y ha encontrado la solución?

    Me gusta

  5. Hola, quisiera saber si despues de crear el link simbólico el sitio web puede ser accesible desde otro PC en la red, sin problema alguno? Pues sucede que logro conectarme al sitio desde otra PC de mi empresa, se muestra el login ytodo en blanco. Favor de ayudar con esta cuestion, gracias.

    Me gusta

  6. Estimados, saludos a todos. Me estoy comenzando a involucrar en un proyecto basado en laravel que no lo conozco muy bien, el asunto es que el proyecto lo tienen funcionando en un equipo en local y el mismo funciona salvo algunos pequeños detalles. Cuando hice el deploy del proyecto en el servidor namecheap, el sistema al parecer estaba funcionando bien hasta que se estuvo probando, algunas funciones del mismo no estan trabajando como en el equipo en local. No doy con una pista solida solo sospecho que se trata de las rutas. Alguna sugerencia? que les puedo indicar para obtener mas ayuda. El metodo del despliegue fue similar al que describen al principio de este post. Saludos y agradecido por su tiempo.

    Me gusta

Deja un comentario (puedes utilizar Markdown)