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.
- 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.
- 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.- Abran una consola como Administrador – importante -.
- Vayan al directorio web público:
cd C:\xampp\htdocs
- 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
- Windows
- 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:
- 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. 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/ ...
- 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/ ...
- El contenido ‘public‘ del framework debe ir en la carpeta mi-proyecto que creamos.
- Una vez copiado el contenido, deben abrir y editar el archivo index.php.
- 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';
- 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',
- 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.
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Hola quería saber como se hace con un servidor IIS. Para poder acceder tengo que entrar de esta manera, Dominio.com/public, quiero quitarla y que solo tenga que poner Dominio.com, gracias.
Me gustaMe gusta
Nunca he trabajado con IIS, pero me imagino que la solución de más arriba de crear un link simbólico debe ser totalmente válida.
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
tiene 750 y funciona sin problemas, muchas gracias por toda la ayuda que brindas amigo! sigue así.
Me gustaMe gusta
Ya lo leí un buen de veces pero no le entendí nada
Me gustaMe gusta
¿Qué es lo que no entiendes?
Me gustaMe gusta
hay algo que cambiar sobre las rutas… no encuentra una url dice..
Me gustaMe gusta
No es necesario hacer cambio en las rutas, debería funcionar tal cual como está. Te recomiendo comentar tu problema en http://laravales.com para buscar ayuda en la comunidad. Por aquí puede ser un poco tedioso.
Me gustaMe gusta
y si simplemente en el virtualhost pones documentroot apuntando /var/www/tusitio/public o donde sea que este tu public
Me gustaMe gusta
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 gustaMe gusta
me funciono a la primera! gracias por compartir
Me gustaMe gusta
Esta muy confuso este método mejor as un vídeo para explicarlo a detalle
Me gustaMe gusta
Lamentablemente no tengo tiempo para realizar videos. ¿Cuál de todos los métodos no logras entender?. Puedes preguntar en el foro de la comunidad: http://laraveles.com
Me gustaMe gusta
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 gustaMe gusta
No he visto ningún post tuyo en el foro, ¿cuál es tu usuario?. Me encantaría hacerme el tiempo para hacer un video, pero de verdad no lo tengo.
Me gustaMe gusta
que weon tan pesao el ricote jasjasjas gracias por su tiempo hermano.
Me gustaMe gusta
Hola,
subí todas las carpetas excepto public a un nivel arriba de «public_html» y en esta última he creado una carpeta con el nombre «io» donde puse el contenido de «public», al acceder a la ruta: http://www.midominio.com/io no me muestra nada.
Gracias desde ya!
Me gustaMe gusta
Hola,
¿Hiciste el cambio de las rutas en index.php y en los otros archivos?.
Si visitas http://laraveles.com la comunidad te puede ayudar ;)
Me gustaMe gusta
Muchas Gracias, fue de mucha ayuda
Me gustaMe gusta
Hola, realice todos los pasos y al momento de ingresar la url, me aparece como acceso prohibido, esto es obvio ya que estoy intentando acceder a una carpeta fuera de htdocs, se agradece mucho la ayuda :)
Me gustaMe gusta
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 gustaMe gusta
Exacto, tendrías que tener otroa carpeta para trabajar con Laravel.
Me gustaMe gusta
Buenas tardes, estoy trabajando en Laravel 5 pero no tengo acceso al path.php alguien sabe como hacer en este caso?
Me gustaMe gusta
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 gustaMe gusta
hola buenas tardes ayuda ya hice todo lo que pidio pero no me funciona quiero colocar el dominio para que salga en la web ejemplo http://www.tucanal.bo pero nose como configurarlo ayuda
Me gustaMe gusta
Hola, Luis.
¿Estás en un hosting compartido?. ¿Pediste ayuda en laraveles.com?.
Saludos.
Me gustaMe gusta
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 gustaMe gusta
Claro que funcionará. Si estás con Apache deberás modificar la configuración para que sólo permita conexiones locales y no externas: http://serverfault.com/questions/253792/apache-on-localhost-to-block-incoming-connections-outside-localhost
Me gustaMe gusta
hola, seguí todos pasos al pie de la letra y todo bien me muestra la primera vista, luego al ingresar a la url planSalud/login me sale
/planSalud/login was not found on this server
les agradecería una pronta respuestas
Me gustaMe gusta
Hola,
Me preguntaba cual sería la forma para acceder a mi aplicación asi: http://localhost y no http://localhost/laravel esto es posible? gracias
Me gustaMe gusta
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 gustaMe gusta
Hola, te recomiendo ir a laraveles.com en el foro te podrán ayudar. Saludos.
Me gustaMe gusta
Hola, efectivamente lo intente pero no me puedo registrar en laraveles, tienen un problema al momento de enviar el correo y no puedo avanzar con ese foro, por eso recurrí a este sitio.
Me gustaMe gusta