Cómo eliminar /public/ de una URL de Laravel [duplicado]
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
Nota: Esto introduce problemas de seguridad muy importantes y no se recomienda.
Para Laravel 5:
- Cambie el nombre
server.php
en su carpeta raíz de Laravel aindex.php
- Copie el
.htaccess
archivo del/public
directorio a su carpeta raíz de Laravel.
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.php
de su carpeta raíz de Laravel index.php
y copiar el .htaccess
archivo del /public
directorio a su carpeta raíz de Laravel!
De esta manera todos pueden acceder a algunos de sus archivos ( .env
por ejemplo). Inténtalo tú mismo. ¡No quieres eso!
HACER
En su lugar, deberías crear un .htaccess
archivo 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 /public
carpeta. 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.
Nota: Esto introduce problemas de seguridad muy importantes y no se recomienda.
Resolví el problema usando 2 respuestas:
Cambiar el nombre de server.php a index.php (sin modificaciones)
Copie el .htaccess de la carpeta pública a la carpeta raíz (como dice rimon.ekjon a continuación)
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
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>
Cree un .htaccess
archivo 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>