Laravel 5 - Eliminar Public de URL


241

Sé que esta es una pregunta muy popular, pero no he podido encontrar una solución que funcione para Laravel 5. He estado tratando de migrar desde Codeigniter durante mucho tiempo, pero este complicado proceso de instalación me desanima.

No quiero ejecutar una VM, esto simplemente parece incómodo al cambiar de proyecto.

No quiero establecer la raíz de mi documento en la carpeta pública, esto también es incómodo al cambiar de proyecto.

He probado el método .htaccess mod_rewrite

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

Esto solo me da una Laravel NotFoundHttpException en la línea compiled.php 7610.

Cuando probé L4 hace un tiempo, utilicé el método de mover el contenido de la carpeta pública a la raíz. La estructura de L5 es bastante diferente y seguir los mismos pasos rompió completamente Laravel (el servidor solo devolvería una página en blanco).

¿Existe un método decente para eliminar 'público' en un entorno de desarrollo que:

  1. Funciona con L5
  2. Me permite cambiar entre proyectos con facilidad (generalmente estoy trabajando en 2 o 3 en cualquier momento).

Gracias

** Estoy usando MAMP y PHP 5.6.2


1
La estructura de carpetas en la guía es diferente a la mía, me imagino que no está usando L5. Omití los cambios que hizo en el archivo Bootstrap / Paths, porque no existe. Sin embargo, el proyecto parece estar funcionando. ¿Crees que esto está bien?
user1537360

mi error déjame agregar una respuesta para L5
kamlesh.bar

sin éxito intentando lo mismo
kamlesh.bar

1
Parece funcionar simplemente modificando las rutas en el archivo index.php, pero soy nuevo en Laravel, así que obviamente no puedo comentar si esto es estable / seguro.
user1537360

Se supone que las otras carpetas / archivos están debajo de la raíz del documento.
Mike Rockétt

Respuestas:


431

Para Laravel 5:

  1. Cambie el nombre server.phpen la carpeta raíz de Laravel aindex.php
  2. Copie el .htaccessarchivo del /publicdirectorio a su carpeta raíz de Laravel.

¡Eso es!


105
ya que esto puede ser inseguro, asegúrese de que nadie pueda solicitar su .envarchivo si está haciendo esto a menos que esté de acuerdo con que las personas vean la contraseña de su base de datos en texto claro;)
GabLeRoux

49
Esto no funcionaría si hace referencia a sus activos utilizando la ruta relativa desde la raíz, es decir. "/assets/styles.css" y así sucesivamente. Todavía estoy luchando por encontrar la mejor manera de implementarlo en servidores
Ghazanfar Mir

1
Esto funciona ... ¿Pero hay alguna consecuencia / desventaja en usar esto? Muchos sugieren configurar un host virtual o copiar archivos manualmente, etc. ¿Funciona esto también en producción?
Bogz

1
@GabLeRoux <Files "log.txt">Order Allow,DenyDeny from all</Files>resuelve el problema que abordó. ¿Es seguro ahora o hay más riesgo?
Mariposa

1
@Butterflyit depende de la configuración de su servidor. Lo anterior solo bloqueará log.txt. Solo asegúrese de bloquear los datos confidenciales del público. Si usa Laravel y lee la documentación cuidadosamente , su webroot se verá así project/public. Eche un vistazo a esta discusión de stackoverflow qa . Configure su servidor web e intente por https://example.com/.envsi acaso. Si ve sus contraseñas, considere todo comprometido y cambie todas las contraseñas.
GabLeRoux

126

He resuelto el problema usando 2 respuestas:

  1. Cambiar el nombre del servidor.php a index.php (sin modificaciones)
  2. Copie el .htaccess de la carpeta pública a la carpeta raíz (como rimon.ekjon dijo a continuación)
  3. Cambiando .htaccess un poco de la siguiente manera para las estadísticas:

    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]
    
    RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !^/public/
    RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]

    Si se necesitan otros archivos estáticos, simplemente agregue la extensión a la lista declarada anterior


1
hola @KA_lin. ¿Cómo evito que alguien vea .env como localhost / oap / .env?
Fokwa Best

8
Hmmm ... pruebaRewriteRule ^.env - [F,L,NC]
ka_lin

2
O bien <Files ~ "\.env$"> Order allow,deny Deny from all </Files>
ka_lin

Muchas gracias @ka_lin, ¿hay alguna forma de eliminar el acceso a través de / public /? como www.yoursite.com funciona pero www.yoursite.com/public también funciona, ¿es posible eliminar el último?
adaba

8
Está funcionando pero css, js e imágenes no se están cargando
Chetan Khandla

94

En Laravel 5.5, cree el archivo .htacess en su directorio raíz y coloque el siguiente código: - Enlace de referencia

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1 

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php

</IfModule>

55
la mejor respuesta! el único que funcionó en mi ejemplo, definitivamente debería tener más votos
positivos

Gracias, esto es trabajo para mí. Pero quiero saber si tiene algún problema de seguridad o no.
Rahul Singh Chauhan

@rahulsinghChauhan, es un placer. Querido, no sé con respecto al problema de seguridad, pero debería ser seguro.
Raham

2
¿Qué esta regla RewriteRule ^ ^$1 [N] hacer?
gonzo

Este es el único que funcionó para mí ... muchas gracias
Arshad Ameen

87

¡NO!

¡REALMENTE NO DEBE cambiar el nombre server.phpde su carpeta raíz de Laravel index.php y copiar el .htaccessarchivo del /publicdirectorio a su carpeta raíz de Laravel!

De esta manera todo el mundo puede acceder a algunos de sus archivos ( .envpor ejemplo). Inténtalo tú mismo. ¡No quieres eso!


HACER

En su lugar, debe crear un .htaccessarchivo en su raíz como este:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ /public/$1 [L,QSA]

Esto reescribirá silenciosamente todos sus URI base en la /publiccarpeta. Incluso todos los encabezados , por ejemplo el encabezado de autorización HTTP , y todos los parámetros opcionales de URI se pasarán silenciosamente a la /publiccarpeta también.

Eso es todo

Tenga en cuenta al configurar un proyecto Laravel con Docker: no necesitará hacer esto.


2
¿Funciona bien en la producción pero no funciona en local alguna sugerencia?
Haritsinh Gohil

2
¡Esto está funcionando perfectamente! local y servidor gracias por la ayuda de seguridad!
Ghanshyam Nakiya

1
Hola, @DerkJanSpeelman Estoy tratando de cargar mis archivos laravel dentro de una subcarpeta en mi hosting como: (ejemplo.com/proyectos/laravel/blog) en ese caso, los visitantes tienen que visitar example.com/projects/laravel/blog/ público, de modo que coloco un archivo .htaccess con su código en la raíz de la carpeta del blog y quiero que redirija a la carpeta pública. Pero no está funcionando. Aquí se produce el error: la URL solicitada / public / no se encontró en este servidor. Como puedo resolver esto ?
Shovon Das

1
Esta respuesta está subestimada. Votó a favor de Negrita y destacó No. Funciona absolutamente bien.
Varun Ved

2
La respuesta perfecta
alnassre

43

Manera fácil de eliminar public de laravel 5 url. Solo necesita cortar index.php y .htaccess del directorio público y pegarlo en el directorio raíz, eso es todo, y reemplazar dos líneas en index.php como

require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';

Nota : El método anterior es solo para los principiantes, ya que pueden tener problemas para configurar el host virtual y la mejor solución es configurar el host virtual en la máquina local y señalarlo al directorio público del proyecto.


1
Después de que css no se cargue, porque todos los css están en público y el público se elimina de la URL
Sr. Tomar,

1
Puede poner "public /" antes de los archivos js o css durante la carga, por ejemplo, Html :: script ("public / js / ....."); --Pero la mejor solución sería un host virtual ...
Muhammad Sadiq

39

@ rimon.ekjon dijo:

Cambie el nombre del servidor.php en la carpeta raíz de Laravel a index.php y copie el archivo .htaccess del directorio / public a su carpeta raíz de Laravel. -- Eso es !! :)

Eso me funciona. Pero todos los archivos de recursos en el directorio / public no pudieron encontrar y solicitar URL no funcionaron, porque utilicé el asistente de activo ().

Cambié /Illuminate/Foundation/helpers.php/asset () funciona de la siguiente manera:

function asset($path, $secure = null)
{
    return app('url')->asset("public/".$path, $secure);
}

Ahora todo funciona :)

Gracias @ rimon.ekjon y a todos ustedes.


3
Esta no es una buena manera de resolver este problema, ya que está intentando actualizar en el directorio de proveedores, lo cual no es una buena práctica.
Shadman

1
solo necesita agregar RewriteRule ^(.*)$ public/$1 [L]su archivo .htaccess que ha copiado del directorio público, eliminando esta líneaRewriteRule ^(.*)/$ /$1 [L,R=301]
Shadman

29

Simplemente cree el archivo .htaccess en la raíz y agréguele estas líneas

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

¡Eso es!

El código anterior funciona en la carpeta public_html raíz. Dicho esto, su archivo laravel principal debe estar dentro de la carpeta public_html, si su directorio se ve como public_html / laravelapp / public y si coloca el código anterior dentro de laravelapp, no funcionará. Por lo tanto, debe copiar todos sus archivos principales en public_html y colocar el archivo .htaccess allí.

Si desea mantener el código en un subdirectorio, puede crear un subdominio y este código también funcionará para eso.


Respondí a continuación antes de leer tu respuesta y esta debe ser la respuesta aceptada. Sin cambios de archivo: solo una regla simple e inteligente.
Brigo

@ Raham, ¿cuál es tu url actual?
Abhinav Saraswat

2
Solo quiero agregar una breve descripción sobre el trabajo de este caballero. El código anterior funciona en la carpeta raíz public_html (también tuve problemas). Habiendo dicho que su archivo core laravel debe estar dentro de la carpeta public_html, cometí un error de que mi directorio se veía como public_html / laravelapp / public si coloca el código anterior dentro de laravelapp no ​​funcionará. Por lo tanto, debe copiar todos sus archivos principales en public_html y colocar el archivo .htaccess allí. Referencia a centOS y Cpanel hosting para laravel.
Deepesh Thapa

¿Cuáles son los defectos con el uso de este método?
Script47

1
Funcionó de maravilla para mí, solo tenía cPanel webshost y no pude cambiar el RootDirectory para Apache. Gracias ! Más simple y seguro. Esto no permitirá ver el contenido de su carpeta raíz
Vincent Decaux

27

Cree el .htaccessarchivo en el directorio raíz y coloque el código como se muestra a continuación.

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1 

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php
</IfModule>

1
Realmente recomiendo esta solución.
TheLastCodeBender

1
También recomiendo esta solución
iglesiasedd

Muchas gracias. Esto es perfecto (y)
Prappo Islam Prince

3
funciona bien, pero aún se puede acceder al archivo .env directamente desde la URL.
Manoj Singh

¿Es una solución segura?
Sr. PHP Programmer Team Lead

23

1) No he encontrado un método de trabajo para mover el directorio público en L5 . Si bien puede modificar algunas cosas en el bootstrap index.php, parece que varias funciones auxiliares se basan en la suposición de que ese directorio público está allí. Honestamente, realmente no deberías mover el directorio público.

2) Si está utilizando MAMP, entonces debería crear nuevos vhosts para cada proyecto, cada uno de los cuales servirá ese directorio público de proyectos. Una vez creado, accede a cada proyecto por su nombre de servidor definido de esta manera:

http://project1.dev
http://project2.dev

15

Es posible eliminar la URL pública en laravel5. Sigue estos pasos:

Paso 1: copia todos los archivos del público y pégalos en el directorio raíz

paso 2.abrir index.phparchivo reemplazar con

 require __DIR__.'/../bootstrap/autoload.php';

a

 require __DIR__.'/bootstrap/autoload.php';

y

$app = require_once __DIR__.'/../bootstrap/app.php';

a

$app = require_once __DIR__.'/bootstrap/app.php';

Y elimine todo el caché y las cookies.


Hola, probé su método, realicé los pasos anteriores pero muestra los siguientes errores: Advertencia: require_once (D: \ Projects \ laravel / public / index.php): no se pudo abrir la secuencia: No existe dicho archivo o directorio en D: \ Proyectos \ laravel \ server.php en la línea 21 Error grave: require_once (): Error al abrir 'D: \ Projects \ laravel / public / index.php' (include_path = '.; C: \ xampp \ php \ PEAR' ) en D: \ Proyectos \ laravel \ server.php en la línea 21
Ali Shahzad

Esta no es una respuesta perfecta, sino que es una forma muy insegura.
Rohit

11

Digamos que colocó todos los demás archivos y directorios en una carpeta llamada 'locale'.

ingrese la descripción de la imagen aquí

Simplemente vaya a index.php y encuentre estas dos líneas:

require __DIR__.'/../bootstrap/autoload.php';

$app = require_once __DIR__.'/../bootstrap/app.php';

y cambiarlos a esto:

require __DIR__.'/locale/bootstrap/autoload.php';

$app = require_once __DIR__.'/locale/bootstrap/app.php';

11

Aquí está la solución mejor y más corta que funciona para mí a partir de mayo de 2018 para Laravel 5.5

  1. simplemente corte su .htaccessarchivo del directorio / public al directorio raíz y reemplace el contenido con el siguiente código:

    <IfModule mod_rewrite.c>
        <IfModule mod_negotiation.c>
           Options -MultiViews
        </IfModule>
    
        RewriteEngine On
    
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)/$ /$1 [L,R=301]
    
        RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^ server.php [L]
    
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_URI} !^/public/
        RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
    </IfModule>
  2. Sólo tiene que guardar el .htaccessarchivo y eso es todo.

  3. Cambie el nombre de su server.phparchivo a index.php. eso es todo disfrutar!


9

MEJOR enfoque: no recomendaré eliminar public, en cambio on local computer create a virtual host point to public directoryy on remote hosting change public to public_html and point your domain to this directory. Razón, todo su código laravel será seguro porque tiene un nivel inferior a su directorio público :)

MÉTODO 1:

Acabo de cambiar el nombre server.phpde index.phpy funciona

MÉTODO 2:

Esto funciona bien para todas las versiones de laravel ...

Aquí está mi estructura de directorios,

/laravel/
... app
... bootstrap
... public
... etc

Sigue estos sencillos pasos

  1. mover todos los archivos del directorio público a root / laravel /
  2. ahora, no necesita un directorio público, por lo que opcionalmente puede eliminarlo ahora
  3. ahora abra index.php y realice los siguientes reemplazos

requiere DIR . '/ .. / bootstrap / autoload.php';

a

requiere DIR . '/ bootstrap / autoload.php';

y

$ app = require_once DIR . '/ .. / bootstrap / start.php';

a

$ app = require_once DIR . '/ bootstrap / start.php';

  1. ahora abra bootstrap / paths.php y cambie la ruta del directorio público:

'public' => DIR . '/ .. / public',

a

'public' => DIR . '/ ..',

y eso es todo, ahora intenta http: // localhost / laravel /


Está bien para todo. pero el comando artesanal no funciona, solo muestra "No se pudo abrir el archivo de entrada: artesano". ¿Hay alguna sugerencia?
Kabir Hossain

Este método funcionó, si está bien para exponer sus credenciales de base de datos a los usuarios. localhost / laravel / .env
MasoodUrRehman

8

4 mejores formas de eliminar público de la URL.

Si usó algún otro truco para eliminar el público de la URL, como cambiar el nombre de server.php a index.php y cambiar a la ruta del archivo central. Claramente, no hagas eso. Entonces, ¿por qué Laravel no da la solución como esta porque no es una forma adecuada de hacerlo?

1) Eliminar public de URL usando htaccess en Laravel

Al agregar un archivo .htaccess a la raíz, puede acceder al sitio web sin público

<ifmodule mod_rewrite.c>
    <ifmodule mod_negotiation.c>
        Options -MultiViews
    </ifmodule>

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1 

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php

</ifmodule>

2) Elimine el público creando un host virtual en su local

Estoy dando una demostración aquí para el sistema operativo Windows. Pero intentaré definir un paso para que cualquiera pueda seguirlo fácilmente. También puede buscar en google lo mismo para el sistema operativo en particular.

Paso 1: Vaya a C: \ Windows \ system32 \ drivers \ etc \ abra el archivo "hosts" en modo Administrador.

Paso 2: agregue el siguiente código. Aquí, le doy una demostración de la demostración del nombre de dominio projectname.local, puede especificar cualquiera que desee. Solo hazlo constante en cada lugar.

127.0.0.1  projectname.local

Paso 3: Ahora vaya a, C:\xampp\apache\conf\extrapara usuarios de xampp y para el usuario de wamp "C:\wamp\bin\apache\Apache2.4.4\conf\extra"y abra el "httpd-vhosts.conf"archivo. Ahora agregue el siguiente código en él.

Notas: Cambie la raíz del documento según su proyecto y también agregue el nombre de dominio que defina en el archivo "hosts".

<VirtualHost projectname.local>
      ServerAdmin projectname.local
      DocumentRoot "C:/xampp/htdocs/projectdir"
      ServerName projectname.local
      ErrorLog "logs/projectname.local.log"
      CustomLog "logs/projectname.local.log" common
 </VirtualHost>

Paso 4: Por último, pero el paso importante es reiniciar su Xampp o Wamp y acceder a la URL como http://projectname.localy su Laravel responderá sin URL pública.


3) Eliminar el público ejecutando el comando en Laravel

Si está trabajando en local, entonces no necesita hacer nada, solo necesita ejecutar el siguiente comando desde su terminal o herramienta de línea de comando. Después de eso, puede acceder a su sitio web mediante la URL proporcionada por la línea de comando.

   > php artisan serve

Si está dispuesto a ejecutar su proyecto en una IP particular, entonces necesita ejecutar el siguiente comando. Si está trabajando en LAN, entonces si desea permitir que otras personas accedan a su sitio web desde local, entonces solo necesita verificar su dirección IP usando la línea de comando ejecutando "ipconfig" después de ejecutar su dirección IP siguiendo el comando.

> php artisan serve --host=192.168.0.177

Si está dispuesto a ejecutar su proyecto en una IP particular con un puerto particular, entonces necesita el siguiente comando.

> php artisan serve --host=192.168.0.177 --port=77

4) Eliminar el público en el servidor alojado o en el panel de control

ingrese la descripción de la imagen aquí

Después de completar el proyecto, debe alojar el proyecto en el servidor, luego solo debe configurar la raíz del documento en su dominio en la carpeta pública. Mira la siguiente captura de pantalla.

Según la captura de pantalla, si no tiene ninguna carpeta de proyecto en public_html, entonces solo necesita configurar la raíz de su documento como "public_html/public".

Referencia tomada de aquí


1
Las cuatro formas son buenas, pero he resuelto mi problema utilizando la primera solución.
Manisha

7

Me gustaría agregar a @Humble Learner y tener en cuenta que la ubicación adecuada para "arreglar" la ruta de URL de los activos es /Illuminate/Routing/UrlGenerator.php/asset ().

Actualice el método para que coincida:

public function asset($path, $secure = null)
{
    if ($this->isValidUrl($path)) return $path;
    $root = $this->getRootUrl($this->getScheme($secure));
    return $this->removeIndex($root).'/public/'.trim($path, '/');
}

Esto arreglará scripts, estilos y rutas de imágenes. Cualquier cosa por rutas de activos.


6

Para que el usuario de XAMPP elimine el público de la url sin tocar el sistema de archivos predeterminado laravel, debe configurar un host virtual para que su aplicación haga esto simplemente siga estos pasos

  1. Abra la aplicación del panel de control XAMPP y detenga Apache. Tenga en cuenta que las máquinas con Windows tardías pueden ejecutarlo como un servicio, así que marque la casilla a la izquierda del módulo Apache.

  2. Navegue hacia C:/xampp/apache/conf/extrao donde se encuentren sus archivos XAMPP.

  3. Abra el archivo llamado httpd-vhosts.conf con un editor de texto.

  4. Alrededor de la línea 19 encuentre # NameVirtualHost *:80y descomente o elimine el hash.

  5. En la parte inferior del archivo, pegue el siguiente código:

<VirtualHost *>
    ServerAdmin admin@localhost.com
    DocumentRoot "C:/xampp/htdocs" # change this line with your htdocs folder
    ServerName localhost
    ServerAlias localhost
    <Directory "C:/xampp/htdocs">
        Options Indexes FollowSymLinks Includes ExecCGI
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
  1. Ahora puede copiar y pegar el código de arriba para agregar sus directorios de Virtual Host. Por ejemplo, estoy trabajando en un sitio llamado Eatery Engine, por lo que el siguiente fragmento me permitirá trabajar con subdominios en mi instalación local:
<VirtualHost eateryengine.dev>
    ServerAdmin admin@localhost.com
    DocumentRoot "C:/xampp/htdocs/eateryengine" # change this line with your htdocs folder
    ServerName eateryengine.dev
    ServerAlias eateryengine.dev
    <Directory "C:/xampp/htdocs/eateryengine">
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
  1. Luego dirígete a tu archivo de host de Windows para editar tus HOSTS. el archivo se ubicará enC:/Windows/System32/drivers/etc/hosts , donde hosts es el archivo. Ábralo con el bloc de notas.
  2. Busque la resolución de nombre #localhost que se maneja dentro del mismo DNS.

127.0.0.1 localhost

la resolución del nombre localhost se maneja dentro del DNS mismo.

127.0.0.1       localhost
127.0.0.1       eateryengine.dev #change to match your Virtual Host.
127.0.0.1       demo.eateryengine.dev #manually add new sub-domains.
  1. Reinicia Apache y prueba todo.

El artículo original se puede encontrar aquí.


5

Siempre hay una razón para tener una carpeta pública en la configuración de Laravel, todas las cosas relacionadas públicas deben estar presentes dentro de la carpeta pública,

No apunte su dirección IP / dominio a la carpeta raíz de Laravel, sino que apunte a la carpeta pública. No es seguro apuntar el servidor Ip a la carpeta raíz, porque a menos que escriba restricciones .htaccess, uno puede acceder fácilmente a los otros archivos.

Simplemente escriba la condición de reescritura en el .htaccessarchivo e instale el módulo de reescritura y habilite el módulo de reescritura, el problema que agrega público en la ruta se resolverá.


3

Sé que son una gran solución para este problema. La mejor y más fácil solución es agregar un archivo .htaccess en el directorio raíz .

Probé las respuestas que proporcionamos para este problema, sin embargo, enfrenté algunos problemas con auth: api guard en Laravel.

Aquí está la solución actualizada:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On
    RewriteCond %{HTTP:Authorization} ^(.*)
    RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php
</IfModule>

Cree el archivo .htaccess en su directorio raíz y agregue este código. Y todo va bien


2

Laravel 5.5

Después de instalar Laravel por primera vez, me enfrenté al famoso "problema de la carpeta pública" y se me ocurrió esta solución que, en mi opinión personal , es "más limpia" que las otras que encontré en la Web.


Logros

  • No tengo publicpalabra en el URI
  • Protege el .envarchivo contra personas curiosas

Todo se puede hacer simplemente editando el .htaccessuso mod_rewritey cuatro reglas simples.


Pasos

  1. Mueve el .htaccessarchivo public/.htaccessa la raíz principal
  2. Edítalo como a continuación

Comenté todo, por lo que debería quedar claro (espero) también para aquellos que nunca lo han usado mod_rewrite(no es que sea un experto, todo lo contrario). Además, para comprender las reglas, debe quedar claro que, en Laravel, si Bill se conecta https://example.com, https://example.com/index.phpestá cargado. Este archivo solo contiene el comando header("refresh: 5; https://example.com/public/"), que envía la solicitud a https://example.com/public/index.php. Este segundo index.phpes responsable de cargar el controlador y otras cosas.

# IfModule prevents the server error if the app is moved in an environment which doesn’t support mod_rewrite
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # RULES ORIGINALLY IN public/.htaccess ---
    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
#    RewriteCond %{REQUEST_FILENAME} !-d
#    RewriteCond %{REQUEST_FILENAME} !-f
#    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    # --- END

    # PERSONAL RULES ---
    # All the requests on port 80 are redirected on HTTPS
    RewriteCond %{SERVER_PORT} ^80$
    RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

    # When .env file is requested, server redirects to 404
    RewriteRule ^\.env$ - [R=404,L,NC]

    # If the REQUEST_URI is empty (means: http://example.com), it loads /public/index.php
    # N.B.: REQUEST_URI is *never* actually empty, it contains a slash that must be set as match as below
    # .* means: anything can go here at least 0 times (= accepts any sequence of characters, including an empty string)
    RewriteCond %{REQUEST_URI} ^/$
    RewriteRule ^(.*) /public/index.php [L]

    # If the current request is asking for a REQUEST_FILENAME that:
    # a) !== existent directory
    # b) !== existent file
    # => if URI !== css||js||images/whatever => server loads /public/index.php, which is responsible to load the app and the related controller
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule !^(css|js|images|media)/(.*)$ /public/index.php [L,NC]

    # If the current request is asking for a REQUEST_FILENAME that:
    # a) !== existent directory
    # b) !== existent file
    # => if URI == css||js||images[=$1]/whatever[=$2] => server loads the resource at public/$1/$2
    # If R flag is added, the server not only loads the resource at public/$1/$2 but redirects to it
    # e.g.: bamboo.jpg resides in example.com/public/media/bamboo.jpg
    #       Client asks for example.com/media/bamboo.jpg
    #       Without R flag: the URI remains example.com/media/bamboo.jpg and loads the image
    #       With R flag: the server redirects the client to example.com/public/media/bamboo.jpg and loads the image
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(css|js|images|media)/(.*)$ /public/$1/$2 [L,NC]
    # --- END

</IfModule>

La siguiente regla (originalmente en public/.htaccess) se puede eliminar. La misma regla, de hecho, se explicita de manera más detallada en las últimas dos reglas.

# Handle Front Controller...
#    RewriteCond %{REQUEST_FILENAME} !-d
#    RewriteCond %{REQUEST_FILENAME} !-f
#    RewriteRule ^ index.php [L]

EDIT: Me perdí Abhinav Saraswat solución 's y su respuesta debe ser la aceptada. Solo una regla simple y clara que redirige todo el tráfico a la carpeta pública sin modificar ningún archivo.


2

En primer lugar puedes usar estos pasos

Para Laravel 5:

1. Cambie el nombre de server.php en su carpeta raíz de Laravel por index.php

2. Copie el archivo .htaccess del directorio / public a su carpeta raíz de Laravel.

fuente: https://stackoverflow.com/a/28735930

después de seguir estos pasos, debe cambiar todas las rutas de CSS y script, pero esto será agotador.

Propuesta de solución : simplemente puede hacer cambios menores en la helpers::assetfunción.

Para esto :

  1. abierto vendor\laravel\framework\src\Illuminate\Foundation\helpers.php

  2. ir a la línea 130

  3. escribir "public/".$pathen lugar de $path,

    function asset($path, $secure = null){
       return app('url')->asset("public/".$path, $secure);
    }

2
Regla número 1: nunca edite un archivo central. Incluso si parece fácil y agradable ahora, pagará más tarde.
Janaka Dombawela

@JanakaDombawela no pienso de esa manera porque:
Ferhat KOÇER

@JanakaDombawela No lo creo así porque: Senerio 1: si el desarrollador es experimentado: el código fuente abierto es para este trabajo Senerio 2: si el desarrollador es un junior, el desarrollador debe editar el código fuente para obtener experiencia
Ferhat KOÇER

2
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteRule ^(.*)$ public/$1 [L]
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Active el módulo mod_rewrite con

sudo a2enmod rewrite

y reiniciar el apache

sudo service apache2 restart

Para usar mod_rewrite desde archivos .htaccess (que es un caso de uso muy común), edite el VirtualHost predeterminado con

sudo nano /etc/apache2/sites-available/000-default.conf

Debajo de "DocumentRoot / var / www / html" agregue las siguientes líneas:

<Directory "/var/www/html">
AllowOverride All
</Directory>

Reinicie el servidor nuevamente:

sudo service apache2 restart

1

He leído algún artículo antes y está funcionando bien, pero realmente no sé si es seguro o no

    a. Create new folder local.
    b. Move all project into the local folder expect public folder.
    c. Move all the content of public folder to project root.
    d. Delete the blank public folder
    f. Edit the index file. 

Edite el index.php

require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';

a

require __DIR__.'/local/bootstrap/autoload.php';
$app = require_once __DIR__.'/local/bootstrap/app.php';

1

Incluso si no recomiendo poner Laravel en la carpeta raíz, hay algunos casos en los que no se puede evitar; para esos casos, los métodos anteriores no funcionan para los activos, así que hice una solución rápida cambiando el htaccess: después de copiar server.php a index.php, edite el archivo .htaccess de la siguiente manera:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    ### fix file rewrites on root path ###
    #select file url
    RewriteCond %{REQUEST_URI} ^(.*)$
    #if file exists in /public/<filename>
    RewriteCond %{DOCUMENT_ROOT}/public/$1 -f
    #redirect to /public/<filename>
    RewriteRule ^(.*)$ public/$1 [L]
    ###############

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...

    #RewriteCond %{REQUEST_FILENAME} -d # comment this rules or the user will read non-public file and folders!
    #RewriteCond %{REQUEST_FILENAME} -f #
    RewriteRule ^ index.php [L]
</IfModule>

Esta fue una solución rápida que tuve que hacer para que cualquiera pueda actualizarla.


1

El problema es que si escribe / public y aún estará disponible en la url, por lo tanto, creé una solución que debería colocarse en public / index.php

  $uri = urldecode(
     parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
  );

  if(stristr($uri, '/public/') == TRUE) {

    if(file_exists(__DIR__.'/public'.$uri)){

    }else{

      $actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
      $actual_link = str_replace('public/', '',$actual_link);
      header("HTTP/1.0 404 Not Found");
      header("Location: ".$actual_link."");
      exit();
      return false;
   }}

esta paz de código eliminará el público de la url y dará un 404 y luego redirigirá a la url sin el público


0

Otro método que utilizo es crear un enlace simbólico (en Linux, no sé sobre Win) usando el comando ln en htdocs o www, es decir, ln projectname/public project el sitio es accesible a través de localhost / project


0

Puede eliminar la palabra clave pública de la URL utilizando varios métodos.

1) Si está utilizando un alojamiento dedicado y tiene acceso de root, puede eliminar la palabra clave pública de la url usando Virtual Host. Debe proporcionar la ruta DocumentRoot con public. Entonces esto iniciará el índice del directorio público y lo eliminará de la url.

<VirtualHost *:80>
    ServerAdmin info@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/html/{yoursourcedirectory}/public

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

2) Si no tiene acceso a la raíz de su alojamiento, entonces debe generar un nuevo archivo .htaccess en su directorio raíz y colocar el código de la siguiente manera

<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ ^$1 [N]

RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
RewriteRule ^(.*)$ public/$1 

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php
</IfModule>

Puedes obtener más referencia aquí.


0

Cree el archivo .htaccess en el directorio raíz y coloque el código como se muestra a continuación.

<IfModule mod_rewrite.c>
 #Session timeout

<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ ^$1 [N]

RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
RewriteRule ^(.*)$ public/$1

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php

</IfModule>

Cree el archivo .htaccess en el directorio / public y coloque el código como se muestra a continuación.

<IfModule mod_rewrite.c>
  <IfModule mod_negotiation.c>
    Options -MultiViews -Indexes
  </IfModule>

RewriteEngine On

# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]

# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>

-1

Encontré la solución más funcional para este problema.

Simplemente edite su .htaccessen la carpeta raíz y escriba el siguiente código. Nada más requerido

RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]

<IfModule php7_module>
   php_flag display_errors Off
   php_value max_execution_time 30
   php_value max_input_time 60
   php_value max_input_vars 1000
   php_value memory_limit -1
   php_value post_max_size 8M
   php_value session.gc_maxlifetime 1440
   php_value session.save_path "/var/cpanel/php/sessions/ea-php71"
   php_value upload_max_filesize 2M
   php_flag zlib.output_compression Off
</IfModule>

-1

He intentado alguna solución aquí y encontré htaccess que funciona para laravel 5.2, como este:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]



RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
RewriteRule ^.env - [F,L,NC]
RewriteRule ^app - [F,L,NC]
RewriteRule ^bootstrap - [F,L,NC]
RewriteRule ^config - [F,L,NC]
RewriteRule ^database - [F,L,NC]
RewriteRule ^resources - [F,L,NC]
RewriteRule ^vendor - [F,L,NC]

cuando tienes otro archivo o carpeta para prohibir solo agrega

RewriteRule ^your_file - [F,L,NC]

-1

No necesita hacer mucho, solo cree un archivo .htaccess en el directorio raíz y pegue / guarde el siguiente;

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

Esto me redirige a / public / public
zanderwar

@zanderwar, ¿cuál es la versión de Laravel? Además, ¿espero que no tenga su proyecto en un subdirectorio del directorio principal?
Victor Ifeanyi Ejiogu

El proyecto es root, la versión es 5.6. * - Sin embargo, está en un subdominio, en hosting compartido; desafortunadamente esta instalación de cPanel obliga a los subdominios a tener una carpeta dentro de public_html
zanderwar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.