Come posso rimuovere "public / index.php" nell'URL generato da Laravel?


90

Devo rimuovere index.phpo public/index.phpdall'URL generato in Laravel; comunemente il percorso è localhost/public/index.php/someWordForRoute, dovrebbe essere qualcosa di similelocalhost/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',

Come posso cambiarlo?


7
Graziosi URL in Laravel . Assicurati che mod_rewritesia abilitato.
Kryten


@Kryten non funziona = /
TuGordoBello

2
Questa è la soluzione quando l'altra soluzione non funziona dev-metal.com/enable-mod_rewrite-ubuntu-14-04-lts
TuGordoBello

La radice del documento punta alla cartella desiderata, ovvero/var/www/project_name/public
Kiee

Risposte:


129

Opzione 1: usa .htaccess

Se non è già presente, crea un file .htaccess nella directory root di Laravel. Crea un .htaccessfile nella tua directory principale di Laravel se non esiste già. (Normalmente è nella tua public_htmlcartella)

Modifica il file .htaccess in modo che contenga il codice seguente:

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

Ora dovresti essere in grado di accedere al sito web senza la parte "/public/index.php/".

Opzione 2: sposta gli elementi nella directory "/ public" nella directory principale

Crea una nuova cartella nella directory principale e sposta tutti i file e le cartelle tranne la cartella pubblica. Puoi chiamarlo come vuoi. Userò "laravel_code".

Quindi, sposta tutto fuori dalla directory pubblica e nella cartella principale. Dovrebbe risultare in qualcosa di simile a questo: inserisci qui la descrizione dell'immagine

Dopodiché, tutto ciò che dobbiamo fare è modificare le posizioni nel laravel_code/bootstrap/paths.phpfile e nel index.phpfile.

In laravel_code/bootstrap/paths.phptrova la seguente riga di codice:

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

E modificali in:

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

In index.php, trova queste righe:

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

E modificali in:

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

Fonte: come rimuovere / public / dall'URL in Laravel


5
Se si utilizza Debian Linux, non dimenticate di modificare etc/apache2/apache2.confil passaggio da AllowOverride Nonea AllowOverride Alldove si vede la configurazione Directory, <Directory /var/www/></Directory>.
Robin Hood

1
Dovevo solo avere il file .htaccess nella mia directory principale per farlo funzionare.
Mário Rodrigues

8
Spostarsi in / root non è affatto un buon consiglio in modalità di produzione! C'è un motivo per cui esiste la cartella pubblica
toesslab

Per assicurarti che le regole di riscrittura funzionino, controlla che la configurazione di apache config <Directory ...abbia AllowOverride All'Qualcosa di simile a questo: <Directory "/var/www/html/laravel/public"> Options Indexes FollowSymLinks MultiViews **AllowOverride All** </Directory>
Japheth Ongeri - inkalimeva

E se non ho accesso alla configurazione dell'hosting?
Peter

40

L'ho provato su Laravel 4.2

Rinomina server.phpnella cartella principale di Laravel index.phpe copia il .htaccessfile dalla /publicdirectory nella cartella principale di Laravel.

spero che funzioni


1
Se la risposta accettata da Luazan non funziona, allora sarà sufficiente. Anche se mi assicurerei di modificare il file index.php nella cartella pubblica per reindirizzare gli utenti fuori dal pubblico se vanno direttamente a quel collegamento.
Brad Bird

4
I file js e css non vengono più caricati dalla cartella pubblica
llioor

@MaHDyfo - perché non è sicuro? e come ?
151291

2
@ 151291 perché il file .env è accessibile a chiunque visiti il ​​tuo sito in questo modo. a meno che tu non protegga il tuo server web per evitarlo.
Mahdyfo

17

Non ti confondere con altre opzioni lo snippet di seguito che sto usando e sarà utile anche per te. Metti i seguenti htacces nella tua root.

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

Vai alla tua directory pubblica e inserisci un altro file htaccess con lo snippet di codice di seguito

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

Sta funzionando... !!!

Laravel utilizza sotto .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]

Ottimo: puoi dirmi quali sono i pro e i contro di questo metodo?
Muhammad Ateek

Ho modificato solo il .htaccess in root (il tuo primo snippet) e questo mi ha risolto, grazie!
peird

13

ECCO I SEMPLICI PASSAGGI PER RIMUOVERE PUBLIC IN URL (Laravel 5)

1: Copia tutti i file dalla cartella pubblica e incollali nella cartella principale di laravel

2: Apri index.php e cambia

A partire dal

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

Per

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

E

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

Per

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

In laravel 4 il percorso 2 è $app = require_once __DIR__.'/bootstrap/start.php';invece di$app = require_once __DIR__.'/bootstrap/app.php';/app.php

Questo è tutto.


Ci sono altre complicazioni riguardo ad altri collegamenti dal sito?
Haring10

Sembra un'ottima soluzione e anche semplice. Ma davvero, come ha detto Haring10. Ci sono problemi con questo?
Peter

10

1) Controlla se mod_rewrite è abilitato. Vai alla /etc/apache2/mods-enableddirectory e controlla se rewrite.loadè disponibile. In caso contrario, abilitalo utilizzando il comando sudo a2enmod rewrite. Abilita il modulo di riscrittura. Se è già abilitato, mostrerà il messaggio Module rewrite already enabled.
2) Creare un host virtuale per la directory pubblica in modo che invece di dare http://localhost/public/index.phpsaremo in grado di utilizzare in questo modo http://example.com/index.php. [quindi il nome della cartella pubblica sarà nascosto]
3) Quindi crea un .htaccess che nasconderà index.php dal tuo URL che dovrebbe essere all'interno della directory principale (cartella pubblica)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]

1
Ho provato i tuoi passi. Nessun risultato ancora! Non so perché sta succedendo!
Mostafiz Rahman

Fornisci le informazioni di registro in modo che possiamo rintracciare la causa principale
Orchid


ha funzionato per me. Non fare in modo che l'host virtuale vada direttamente alla cartella pubblica.
cardi777

Grazie. Questo ha funzionato per me, il mio mod_rewriteera disabilitato.
Maubeh

5

Questo probabilmente ha poco a che fare con Laravel e tutto a che fare con le configurazioni di Apache.

Hai accesso alla configurazione del tuo server Apache? In tal caso, dai un'occhiata alla documentazione:

In generale, dovresti usare i file .htaccess solo quando non hai accesso al file di configurazione del server principale. Esiste, ad esempio, un malinteso comune secondo cui l'autenticazione dell'utente dovrebbe essere sempre eseguita nei file .htaccess e, in anni più recenti, un altro malinteso secondo cui le direttive mod_rewrite devono essere inserite nei file .htaccess. Questo semplicemente non è il caso. È possibile inserire le configurazioni di autenticazione utente nella configurazione del server principale e questo è, in effetti, il modo preferito per fare le cose. Allo stesso modo, le direttive mod_rewrite funzionano meglio, sotto molti aspetti, nella configurazione del server principale.

... In generale, l'uso di file .htaccess dovrebbe essere evitato quando possibile. Qualsiasi configurazione che potresti considerare di inserire in un file .htaccess, può essere eseguita altrettanto efficacemente in una sezione del file di configurazione del tuo server principale.

Fonte: documentazione di Apache .

Il motivo per cui lo menziono per primo è perché è meglio sbarazzarsene .htaccesscompletamente, se possibile, e utilizzare un Directorytag all'interno di un VirtualHosttag. Detto questo, per il resto si presume che tu rimanga fedele al .htaccesspercorso per qualsiasi motivo.

Per scomporlo, potrebbero accadere un paio di cose:

  1. Noto, forse inutilmente, che il tuo file è nominato .htaccesnella tua domanda. La mia ipotesi è che si tratti di un errore di battitura, ma nella remota possibilità che tu l'abbia trascurato e in realtà manca solo la seconda s, questo è esattamente il tipo di errore minore che mi lascerebbe sbattere la testa contro il muro alla ricerca di qualcosa di più impegnativo .

  2. Il tuo server non poteva consentire .htaccess. Per verificarlo, vai al tuo file di configurazione di Apache. Nelle build moderne di Apache questo di solito non si trova in un file di configurazione, quindi assicurati di utilizzare quello che punta alla tua app, ovunque esista. Modificare

    AllowOverride none
    

    per

    AllowOverride all
    

    Di conseguenza, i documenti di Apache consigliano anche, per motivi di sicurezza, di non eseguire questa operazione per ogni cartella se si intende .htaccessriscrivere. Invece, fallo per le cartelle a cui devi aggiungere .htaccess.

  3. Hai mod_rewriteabilitato? Questo potrebbe causare i problemi. Ho notato che hai l'etichetta in alto <IfModule mod_rewrite.c>. Prova a commentare quei tag e riavvia Apache. Se ricevi un errore, probabilmente è perché devi abilitare mod_rewrite: Come abilitare mod_rewrite per Apache 2.2

Spero che sia di aiuto. Ho nominato alcuni dei problemi più comuni ma ce ne sono molti altri che potrebbero essere più banali o unici. Un altro suggerimento su un server di sviluppo? Reinstalla Apache. Se possibile, fallo da una fonte diversa con un buon tutorial.


Grande cattura per le impostazioni di configurazione di apache2, mi manca questa impostazione ogni volta.
Abhishek

4

Per Laravel 4 e 5:

  1. Rinomina server.phpnella cartella principale di Laravel inindex.php
  2. Copia il .htaccessfile dalla /publicdirectory alla cartella principale di Laravel .

Questo è tutto !! :)


2

Assicurati anche che Rewrite Engline sia attivato dopo aver modificato il file .htaccess

sudo a2enmod rewrite

Buona osservazione, ero su un nuovo server e in realtà dovevo abilitarlo (e aggiungere anche i bit necessari nella configurazione di apache) usando questo digitalocean.com/community/tutorials/…
cdsaenz

1

Laravel viene fornito con un bel URL .htaccess già ... dovresti essere pronto a uscire dalla scatola ... http://laravel.com/docs/installation#pretty-urls

Assicurati che mod_rewrite sia abilitato e che il tuo percorso home sia impostato sulla directory pubblica della tua applicazione.


Ho attivato mod_rewritee ho copiato il codice che c'è su quella pagina e ancora senza lavori
TuGordoBello

1
Assicurati che in Apache il tuo percorso sia impostato sulla cartella pubblica della tua applicazione.
Kisuka

ServerAdmin webmaster@localhost DocumentRoot /home/web-apps/myproject/public
TuGordoBello

Hai riavviato Apache dopo aver abilitato mod_rewrite?
Kisuka

Ho una cartella chiamata userè il posto dove tengo le foto, inoltre ho un file blade chiamato user, quando scrivo nell'URL myproject.com/usermi mostra il contenuto della cartella, le immagini
TuGordoBello

1

È necessario eseguire i seguenti passaggi per farlo, che sono i seguenti

  • Mappa il tuo dominio sulla cartella pubblica del tuo progetto (cioè / var / www / html / yourproject / public) (se usi linux)

  • Vai alla tua cartella pubblica e modifica il tuo .htaccessfile lì

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>


  • Le ultime tre regole sono per se stai accedendo direttamente a qualsiasi percorso senza https, lo protegga.

0
 RewriteEngine on

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

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

usalo in .htaccess e riavvia il server


0

Spero che questo aiuti come ha fatto per me.

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

0

Ho appena installato Laravel 5 per un progetto e c'è un file nella root chiamato server.php.

Modificalo in index.phpe funziona o digita il terminale:

$cp server.php index.php

0

Rinomina server.phpnella cartella principale di Laravel index.phpe copia il .htaccessfile dalla /publicdirectory nella cartella principale di Laravel.



0

Se utilizzi IIS Windows Server aggiungi il web.configfile nella cartella principale e inserisci il codice seguente:

<?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>

e se usi .htaccess usa questo:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

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

3
Fornisce qualche spiegazione in più alla tua soluzione
Naruto

-3

Secondo Laravel 5.3 le cose di cui sopra non funzioneranno correttamente, ma sii calmo e segui i passaggi seguenti:

Passaggio 1. Vai all'interno del progetto Laravel
Passaggio 2. Crea una directory / cartella casuale es. laravelcode
Passaggio 3. Sposta tutte le cartelle ei file (eccetto la cartella pubblica )
Passaggio 4. Sposta tutte le cartelle ei file che si trovano all'interno della cartella pubblica nel progetto laravel
Passaggio 5. Ora all'interno del progetto laravel c'è il file index.php, per favore aprilo e cambia i percorsi della cartella per bootstrap secondo il nuovo percorso come in precedenza era "require DIR . '/ .. / bootstrap / autoload.php';" ora diventerà "richiede DIR ." / laravelcode / bootstrap / autoload.php '; "

È sufficiente eseguire il tuo URL senza public e index.php come sotto http: // localhost / blog /

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.