¿Cómo puedo eliminar "public / index.php" en la URL generada Laravel?

90

Necesito eliminar index.phpo public/index.phpde la URL generada en Laravel; comúnmente camino es localhost/public/index.php/someWordForRoute, debería ser algo así comolocalhost/someWordForRoute.

.htaccess

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

RewriteEngine On

# Redirect Trailing Slashes.
RewriteRule ^(.*)/$ /$1 [L,R=301]

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

app / config / app.php

'url' => 'http://localhost',

¿Cómo puedo cambiar eso?

TuGordoBello
fuente
7
Bonitas URL en Laravel . Asegúrese de que mod_rewriteesté habilitado.
Kryten
@Kryten no funciona = /
TuGordoBello
2
Esta es la solución cuando la otra solución no funciona dev-metal.com/enable-mod_rewrite-ubuntu-14-04-lts
TuGordoBello
¿La raíz de su documento apunta a la carpeta deseada, es decir/var/www/project_name/public
Kiee

Respuestas:

129

Opción 1: use .htaccess

Si aún no está allí, cree un archivo .htaccess en el directorio raíz de Laravel. Crea un .htaccessarchivo en tu directorio raíz de Laravel si aún no existe. (Normalmente está debajo de tu public_htmlcarpeta)

Edite el archivo .htaccess para que contenga el siguiente código:

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

Ahora debería poder acceder al sitio web sin la parte "/public/index.php/".

Opción 2: mover cosas en el directorio '/ public' al directorio raíz

Cree una nueva carpeta en su directorio raíz y mueva todos los archivos y carpetas excepto la carpeta pública. Puedes llamarlo como quieras. Usaré "laravel_code".

A continuación, mueva todo del directorio público a la carpeta raíz. Debería resultar en algo similar a esto: ingrese la descripción de la imagen aquí

Después de eso, todo lo que tenemos que hacer es editar las ubicaciones en el laravel_code/bootstrap/paths.phparchivo y el index.phparchivo.

En laravel_code/bootstrap/paths.phpbusque la siguiente línea de código:

'app' => __DIR__.'/../app',
'public' => __DIR__.'/../public',

Y cámbielos a:

'app' => __DIR__.'/../app',
'public' => __DIR__.'/../../',

En index.php, encuentre estas líneas:

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

Y cámbielos a:

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

Fuente: Cómo eliminar / public / de la URL en Laravel

Luzan Baral
fuente
5
Si utiliza Debian Linux, no se olvide de editar etc/apache2/apache2.confcambiando de AllowOverride Nonea AllowOverride Alldonde se ve la configuración de directorio, <Directory /var/www/></Directory>.
Robin Hood
1
Solo tenía que tener el archivo .htaccess en mi directorio raíz para que funcionara.
Mário Rodrigues
8
¡Moverse a / root no es un buen consejo en absoluto en el modo de producción! Hay una razón por la que existe la carpeta pública
toesslab
Para asegurarse de que las reglas de reescritura funcionen, verifique que la configuración de apache <Directory ...tenga AllowOverride All'algo como esto: <Directory "/var/www/html/laravel/public"> Options Indexes FollowSymLinks MultiViews **AllowOverride All** </Directory>
Japheth Ongeri - inkalimeva
¿Qué pasa si no tengo acceso conf en hosting?
Peter
40

Probé esto en Laravel 4.2

Cambie el nombre server.phpen la carpeta raíz de Laravel index.phpy copie el .htaccessarchivo desde el /publicdirectorio a la carpeta raíz de Laravel.

espero que funcione

Tejas Jadhav
fuente
1
Si la respuesta aceptada por Luazan no funciona, será suficiente. Aunque me aseguraría de editar el archivo index.php en la carpeta pública para redirigir a los usuarios fuera del público si van directamente a ese enlace.
Brad Bird
4
Los archivos js y css ya no se cargan desde la carpeta pública
llioor
@MaHDyfo: ¿por qué no es seguro? y cómo ?
151291
2
@ 151291 porque el archivo .env es accesible para todos los que visitan su sitio de esta manera. a menos que proteja su servidor web para evitarlo.
Mahdyfo
17

No se confunda con otra opción del fragmento de abajo que estoy usando y que también le será útil. Ponga los siguientes htacces en su raíz.

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

Vaya a su directorio público y coloque otro archivo htaccess con el fragmento de código a continuación

<IfModule mod_rewrite.c>
    RewriteEngine On
    # Removes index.php from ExpressionEngine URLs  
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?url=$1 [PT,L]

</IfModule>

Esta funcionando... !!!

Usos de Laravel a continuación .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]
Ankit Vishwakarma
fuente
Genial: ¿puedes decirme cuáles son los pros y los contras de este método?
Muhammad Ateek
Solo edité el .htaccess en la raíz (su primer fragmento) y eso me lo arregló, ¡gracias!
tercer
13

AQUÍ HAY PASOS SIMPLES PARA ELIMINAR PUBLIC IN URL (Laravel 5)

1: Copie todos los archivos de la carpeta pública y péguelos en la carpeta raíz de laravel

2: Abra index.php y cambie

Desde

 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';

En laravel 4, la ruta 2 es en $app = require_once __DIR__.'/bootstrap/start.php';lugar de$app = require_once __DIR__.'/bootstrap/app.php';/app.php

Eso es.

Khandad Niazi
fuente
¿Existen otras complicaciones con respecto a otros enlaces del sitio?
Haring10 de
Parece una gran solución y también simple. Pero realmente, como dijo Haring10. ¿Hay algún problema con esto?
Peter
10

1) Compruebe si mod_rewrite está habilitado. Vaya al /etc/apache2/mods-enableddirectorio y vea si rewrite.loadestá disponible. Si no es así, habilítelo usando el comando sudo a2enmod rewrite. Habilitará el módulo de reescritura. Si ya está habilitado, mostrará el mensaje Module rewrite already enabled.
2) Crear un host virtual para directorio público para que en lugar de dar http://localhost/public/index.phppodamos usar así http://example.com/index.php. [por lo tanto, el nombre de la carpeta pública se ocultará]
3) Luego cree un .htaccess que ocultará el index.php de su url, que debe estar dentro del directorio raíz (carpeta pública)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]
Orquídea
fuente
1
Probé tus pasos. ¡Aún no obtuve ningún resultado! ¡No sé por qué está pasando esto!
Mostafiz Rahman
Proporcione la información del registro para que podamos rastrear la causa raíz
Orchid
Aquí está el archivo de registro completo: dropbox.com/s/8fhlbej86nqr5qj/laravel.log?dl=0
Mostafiz Rahman
trabajó para mi. No haga que el host virtual vaya directamente a la carpeta pública.
cardi777
Gracias. Esto funcionó para mí, mi mod_rewriteestaba discapacitado.
Maubeh
5

Es probable que esto tenga muy poco que ver con Laravel y mucho que ver con sus configuraciones de Apache.

¿Tiene acceso a la configuración de su servidor Apache? Si es así, mira esto, de los documentos:

En general, solo debe usar archivos .htaccess cuando no tenga acceso al archivo de configuración del servidor principal. Existe, por ejemplo, una idea errónea de que la autenticación de usuario siempre debe realizarse en archivos .htaccess y, en años más recientes, existe otra idea errónea de que las directivas mod_rewrite deben ir en archivos .htaccess. Esto simplemente no es el caso. Puede colocar las configuraciones de autenticación de usuario en la configuración del servidor principal y, de hecho, esta es la forma preferida de hacer las cosas. Asimismo, las directivas mod_rewrite funcionan mejor, en muchos aspectos, en la configuración del servidor principal.

... En general, se debe evitar el uso de archivos .htaccess cuando sea posible. Cualquier configuración que considere poner en un archivo .htaccess, puede realizarse con la misma eficacia en una sección del archivo de configuración del servidor principal.

Fuente: documentación de Apache .

La razón por la que menciono esto primero es porque es mejor deshacerse de él por .htaccesscompleto si puede, y usar una Directoryetiqueta dentro de una VirtualHostetiqueta. Dicho esto, el resto de esto supondrá que te apegas a la .htaccessruta por cualquier motivo.

Para desglosar esto, podrían estar sucediendo un par de cosas:

  1. Observo, quizás inútilmente, que su archivo se menciona .htaccesen su pregunta. Supongo que es un error tipográfico, pero en la remota posibilidad de que lo hayas pasado por alto y, de hecho, solo falten los segundos, este es exactamente el tipo de error menor que me dejaría golpeándome la cabeza contra la pared buscando algo más desafiante. .

  2. Su servidor no podría permitirlo .htaccess. Para verificar esto, vaya a su archivo de configuración de Apache. En las compilaciones modernas de Apache, esto generalmente no está en un archivo de configuración, así que asegúrese de usar el que apunta a su aplicación, donde sea que exista. Cambio

    AllowOverride none
    

    a

    AllowOverride all
    

    Como seguimiento, los documentos de Apache también recomiendan que, por motivos de seguridad, no haga esto para cada carpeta si va a .htaccessreescribir. En su lugar, hágalo para las carpetas a las que necesita agregar .htaccess.

  3. ¿Tiene mod_rewritehabilitado? Eso podría estar causando los problemas. Noto que tienes la etiqueta en la parte superior <IfModule mod_rewrite.c>. Intente comentar esas etiquetas y reinicie Apache. Si recibe un error, probablemente sea porque necesita habilitar mod_rewrite: Cómo habilitar mod_rewrite para Apache 2.2

Espero que esto ayude. He mencionado algunos de los problemas más comunes, pero hay varios otros que podrían ser más mundanos o únicos. ¿Otra sugerencia sobre un servidor de desarrollo? Vuelva a instalar Apache. Si es posible, hágalo de una fuente diferente con un buen tutorial.

smcjones
fuente
Gran captura para los ajustes de configuración de apache2, echo de menos esta configuración cada vez.
Abhishek
4

Para Laravel 4 y 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 .

Eso es !! :)

Abhijeet Navgire
fuente
2

También asegúrese de que Rewrite Engline esté encendido después de editar el archivo .htaccess

sudo a2enmod rewrite
Rafik Bari
fuente
Buena observación Estaba en un servidor nuevo y de hecho tuve que habilitarlo (y agregar los bits necesarios en la configuración de apache también) usando este digitalocean.com/community/tutorials/…
cdsaenz
1

Laravel se envía con una bonita URL .htaccess ya ... debería estar listo para salir de la caja ... http://laravel.com/docs/installation#pretty-urls

Asegúrese de que mod_rewrite esté habilitado y que su ruta de inicio esté configurada en el directorio público de su aplicación.

Kisuka
fuente
Activé mod_rewritey copié el código que está en esa página y aún no funciona
TuGordoBello
1
Asegúrese de que en Apache su ruta esté configurada en la carpeta pública de su aplicación.
Kisuka
ServerAdmin webmaster@localhost DocumentRoot /home/web-apps/myproject/public
TuGordoBello
¿Reinició apache después de habilitar mod_rewrite?
Kisuka
Tengo una carpeta llamada useres el lugar donde guardo las fotos, también tengo un archivo blade que se llama user, cuando escribo en la URL myproject.com/userme muestra el contenido de la carpeta, las fotos
TuGordoBello
1

Debe realizar los siguientes pasos para hacer esto, que son los siguientes

  • Asigne su dominio a la carpeta pública de su proyecto (es decir, / var / www / html / yourproject / public) (si usa linux)

  • Vaya a su carpeta pública edite su .htaccessarchivo allí

AddHandler application/x-httpd-php72 .php
<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 non-www to www
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    # Redirect non-http to https
    RewriteCond %{HTTPS} off
    RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    # 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]

    # Remove index.php
    RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
    RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]
</IfModule>


  • Las últimas tres reglas son para si está accediendo directamente a cualquier ruta sin httpsla protección.
Shahrukh Anwar
fuente
0
 RewriteEngine on

 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d

 RewriteRule ^(.*)$ index.php/$1 [L]

use esto en .htaccess y reinicie el servidor

Arun
fuente
0

Espero que esto ayude como lo hizo conmigo.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
Harry Bosh
fuente
0

Acabo de instalar Laravel 5 para un proyecto y hay un archivo en la raíz llamado server.php.

Cámbielo a index.phpy funciona o escriba terminal:

$cp server.php index.php
Samuel Kwame Antwi
fuente
0

Cambie el nombre server.phpen la carpeta raíz de Laravel index.phpy copie el .htaccessarchivo desde el /publicdirectorio a la carpeta raíz de Laravel.

Rizwan Taj
fuente
0

Si usa IIS Windows Server, agregue el web.configarchivo en la carpeta raíz y coloque el siguiente código:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Imported Rule 1" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{URL}" pattern="^system.*" ignoreCase="false" />
                    </conditions>
                    <action type="Rewrite" url="/index.php/{R:1}" />
                </rule>
                <rule name="Imported Rule 2" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                        <add input="{R:1}" pattern="^(index\.php|images|robots\.txt|css)" ignoreCase="false" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

y si usas .htaccess usa este:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
Abd Abughazaleh
fuente
-3
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)/(public)/(index.php)/$ $1/$4 [L]
</IfModule>
sitio web
fuente
3
Proporciona alguna explicación más a tu solución
Naruto
-3

Según Laravel 5.3, las cosas anteriores no funcionarán correctamente, pero tenga la calma y siga los pasos a continuación:

Paso 1. Vaya al interior del proyecto laravel
Paso 2. Cree un directorio / carpeta aleatorio, por ejemplo. laravelcode
Paso 3. Mueva todas las carpetas y archivos (excepto la carpeta pública )
Paso 4. Mueva todas las carpetas y archivos que están dentro de la carpeta pública al proyecto laravel
Paso 5. Ahora, dentro del proyecto laravel hay un archivo index.php, por favor abre eso y cambia las rutas de la carpeta para bootstrap según la nueva ruta como antes era "require DIR . '/ .. / bootstrap / autoload.php';" ahora se convertirá en "require DIR . '/ laravelcode / bootstrap / autoload.php';"

Eso es, simplemente ejecute su URL sin public e index.php como debajo de http: // localhost / blog /

amar nath jena
fuente