Cómo eliminar /public/ de una URL de Laravel [duplicado]

Resuelto user1537360 asked hace 54 años • 30 respuestas

Quiero eliminar el /public/fragmento de mis URL de Laravel 5.

No quiero ejecutar una máquina virtual, esto parece incómodo al cambiar entre proyectos.

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

Probé el método .htaccess mod_rewrite:

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

pero esto me da una excepción Laravel NotFoundHttpException en la línea 7610 de compiled.php.

En Laravel 4 podía mover el contenido de la carpeta pública a la raíz. La estructura de Laravel 5 es bastante diferente y siguiendo los mismos pasos se rompía por completo Laravel (el servidor solo devolvería una página en blanco).

¿Existe algún método para eliminar lo "público" en un entorno de desarrollo que me permita cambiar entre proyectos con facilidad (normalmente trabajo en 2 o 3 a la vez)?

Estoy usando MAMP y PHP 5.6.2

user1537360 avatar Jan 01 '70 08:01 user1537360
Aceptado

Nota: Esto introduce problemas de seguridad muy importantes y no se recomienda.

Para Laravel 5:

  1. Cambie el nombre server.phpen su carpeta raíz de Laravel aindex.php
  2. Copie el .htaccessarchivo del /publicdirectorio a su carpeta raíz de Laravel.
Asfaq Tamim avatar Feb 26 '2015 06:02 Asfaq Tamim


TENGA EN CUENTA que cuando publique un proyecto de Laravel con Docker: no necesitará hacer nada de esto. Utilice esta opción solo cuando su directorio raíz (o más comúnmente: public_html) de su sitio web sea su proyecto Laravel (este no es el caso cuando usa Docker).

¡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 todos pueden acceder a algunos de sus archivos ( .envpor ejemplo). Inténtalo tú mismo. ¡No quieres eso!


HACER

En su lugar, deberías crear un .htaccessarchivo en tu 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/public , y todos los parámetros URI opcionales también se pasarán silenciosamente a la carpeta.

Derk Jan Speelman avatar Nov 28 '2018 10:11 Derk Jan Speelman

Nota: Esto introduce problemas de seguridad muy importantes y no se recomienda.

Resolví el problema usando 2 respuestas:

  1. Cambiar el nombre de server.php a index.php (sin modificaciones)

  2. Copie el .htaccess de la carpeta pública a la carpeta raíz (como dice rimon.ekjon a continuación)

  3. Cambiando .htaccess un poco de la siguiente manera para estática:

    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 anteriormente

ka_lin avatar Sep 15 '2015 07:09 ka_lin

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>
Raham avatar Jan 29 '2018 04:01 Raham

Cree un .htaccessarchivo en el directorio raíz y coloque un código similar al siguiente. Sin embargo, esto aún permitirá que se pueda acceder a su archivo .env a través de una URL, por lo que no es seguro.

<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>
Pallav Nagar avatar Jan 20 '2019 09:01 Pallav Nagar