Laravel 5 - Rimuovi pubblico dall'URL


241

So che questa è una domanda molto popolare, ma non sono stato in grado di trovare una soluzione funzionante per Laravel 5. Ho provato a migrare da Codeigniter per molto tempo, ma questo complicato processo di installazione continua a rimandare.

Non voglio eseguire una VM, questo sembra imbarazzante quando si passa da un progetto all'altro.

Non voglio impostare la radice del mio documento sulla cartella pubblica, anche questo è scomodo quando si passa da un progetto all'altro.

Ho provato il metodo .htaccess mod_rewrite

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

Questo mi dà solo una Laravel NotFoundHttpException nella riga 7610 compilata.php.

Quando ho provato L4 qualche tempo fa, ho usato il metodo per spostare il contenuto della cartella pubblica nella radice. La struttura di L5 è piuttosto diversa e seguendo gli stessi passaggi ha completamente rotto Laravel (il server restituisce solo una pagina vuota).

Esiste un metodo decente per rimuovere "pubblico" in un ambiente di sviluppo che:

  1. Funziona con L5
  2. Mi permette di passare facilmente da un progetto all'altro (di solito lavoro 2 o 3 contemporaneamente).

Grazie

** Sto usando MAMP e PHP 5.6.2


1
La struttura delle cartelle nella guida è diversa dalla mia, immagino che non stia usando L5? Ho omesso le modifiche apportate al file Bootstrap / Paths, perché non esiste. Il progetto sembra funzionare però. Pensi che sia ok?
user1537360

il mio errore mi ha permesso di aggiungere una risposta per L5
kamlesh.bar

nessun successo provando per lo stesso
kamlesh.bar

1
Sembra funzionare semplicemente modificando i percorsi nel file index.php, ma sono nuovo di Laravel, quindi ovviamente non posso commentare se questo è stabile / sicuro.
user1537360

Le altre cartelle / file dovrebbero trovarsi sotto la radice del documento.
Mike Rockétt,

Risposte:


431

Per Laravel 5:

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

Questo è tutto!


105
in quanto ciò potrebbe non essere sicuro, assicurati che nessuno possa richiedere il tuo .envfile se lo stai facendo a meno che tu non stia bene con le persone che visualizzano la password del tuo database in chiaro;)
GabLeRoux

49
Questo non funzionerebbe se stai facendo riferimento alle tue risorse usando il percorso relativo dalla radice, ad es. "/assets/styles.css" e così via. Faccio ancora fatica a trovare il modo migliore per distribuirlo sui server
Ghazanfar Mir

1
Funziona ... Ma c'è qualche conseguenza / svantaggio nell'usarlo? Molti suggeriscono di configurare l'host virtuale o di copiare manualmente i file, ecc ... Funziona anche in produzione?
Bogz,

1
@GabLeRoux <Files "log.txt">Order Allow,DenyDeny from all</Files>risolve il problema che hai risolto. È sicuro ora o più rischi?
Butterfly,

1
@Butterflyit dipende dalla configurazione del tuo server. Quanto sopra bloccherà solo log.txt. Assicurati solo di bloccare i dati sensibili dal pubblico. Se usi Laravel e leggi attentamente la documentazione , apparirà il tuo webroot project/public. Dai un'occhiata a questa discussione su StackOverflow qa . Configura il tuo server web e prova https://example.com/.envnel caso. Se vedi le tue password, considera tutto compromesso e cambia tutte le password.
GabLeRoux,

126

Ho risolto il problema utilizzando 2 risposte:

  1. Rinominare server.php in index.php (nessuna modifica)
  2. Copia il .htaccess dalla cartella pubblica alla cartella principale (come rimon.ekjon detto sotto)
  3. Cambiando .htaccess un po 'come segue per statica:

    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]

    Se sono necessari altri file statici, è sufficiente aggiungere l'estensione all'elenco dichiarato precedente


1
ciao @KA_lin. Come posso impedire a qualcuno di visualizzare .env in questo modo localhost / oap / .env
Fokwa Best

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

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

Grazie mille @ka_lin, c'è un modo per rimuovere l'accesso tramite / public /? come www.yoursite.com funziona ma anche www.yoursite.com/public funziona, è possibile rimuovere l'ultimo?
adaba,

8
Funziona ma css, js e immagini non si stanno caricando
Chetan Khandla il

94

In Laravel 5.5 creare il file .htacess nella directory principale e inserire il seguente codice: - Link di riferimento

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

5
la migliore risposta! l'unico ha funzionato nel mio esempio, dovrebbe avere decisamente più voti
FiliusBonacci il

Grazie, questo è un lavoro per me. Ma voglio sapere che ha qualche problema di sicurezza o meno.
Rahul Singh Chauhan,

@rahulsinghChauhan il mio piacere.Dear non so per quanto riguarda il problema di sicurezza ma dovrebbe essere sicuro.
Raham,

2
Cosa fa questa regola RewriteRule ^ ^$1 [N]?
bizzarri

Questo è l'unico che ha funzionato per me ... grazie mille
Arshad Ameen,

87

DO NOT!

server.phpDavvero NON DOVREBBE rinominare nella cartella principale di Laravel index.php e copiare il .htaccessfile dalla /publicdirectory nella cartella principale di Laravel !!!

In questo modo tutti possono accedere ad alcuni dei tuoi file ( .envad esempio). Provate voi stessi. Non lo vuoi!


FARE

Invece, dovresti creare un .htaccessfile nella tua radice in questo modo:

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

Ciò riscriverà silenziosamente tutti gli URI di base nella /publiccartella. Anche tutte le intestazioni , ad esempio l'intestazione di autorizzazione HTTP , e tutti i parametri URI opzionali verranno passati silenziosamente anche alla /publiccartella.

È tutto

Si prega di notare quando si imposta un progetto Laravel con Docker: non sarà necessario farlo.


2
Funziona benissimo in produzione ma non funziona in locale alcun suggerimento?
Haritsinh Gohil,

2
Funziona perfettamente! locale e server grazie per l'aiuto di sicurezza!
Ghanshyam Nakiya,

1
Ciao, @DerkJanSpeelman Sto provando a caricare i miei file laravel all'interno di una sottocartella del mio hosting come: (esempio.com/projects/laravel/blog) in tal caso, i visitatori devono visitare example.com/projects/laravel/blog/ pubblico, in modo che io inserisca un file .htaccess con il tuo codice nella cartella principale del blog e lo desideri reindirizzare alla cartella pubblica. Ma non funziona. Qui si verifica l'errore: l'URL richiesto / public / non è stato trovato su questo server. Come posso risolvere questo ?
Shovon Das,

1
Questa risposta è sottovalutata. È stato votato in grassetto e evidenziato No. Funziona perfettamente.
Varun Ved,

2
La risposta perfetta
alnassre,

43

Modo semplice per rimuovere pubblico dall'URL laravel 5. Devi solo tagliare index.php e .htaccess dalla directory pubblica e incollarlo nella directory root, tutto qui e sostituire due righe in index.php come

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

Nota : il metodo sopra è solo per i principianti poiché potrebbero trovarsi di fronte a problemi nell'impostazione dell'host virtuale e la soluzione migliore è quella di impostare l'host virtuale sul computer locale e puntarlo alla directory pubblica del progetto.


1
Dopo che i CSS non si caricano, tutti i CSS sono pubblici e il pubblico viene rimosso dall'URL
Mr. Tomar

1
È possibile inserire "public /" prima dei file js o css durante il caricamento, ad esempio Html :: script ("public / js / ....."); - Ma la soluzione migliore sarebbe host virtuale ...
Muhammad Sadiq,

39

@ rimon.ekjon ha detto:

Rinominare server.php nella cartella principale di Laravel in index.php e copiare il file .htaccess dalla directory / public nella cartella principale di Laravel. -- Questo è tutto !! :)

Funziona per me. Ma tutti i file di risorse nella directory / public non sono riusciti a trovare e gli URL di richiesta non hanno funzionato, perché ho usato l'helper asset ().

Ho cambiato la funzione /Illuminate/Foundation/helpers.php/asset () come segue:

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

Ora tutto funziona :)

Grazie @ rimon.ekjon e tutti voi.


3
Questo non è un buon modo per risolvere questo problema, poiché stai cercando di aggiornare nella directory dei fornitori che non è una buona pratica.
Shadman,

1
devi solo aggiungere il RewriteRule ^(.*)$ public/$1 [L]tuo file .htaccess che hai copiato dalla directory pubblica, rimuovendo questa rigaRewriteRule ^(.*)/$ /$1 [L,R=301]
Shadman

29

Basta creare il file .htaccess alla radice e aggiungere queste righe ad esso

<IfModule mod_rewrite.c>
    RewriteEngine On

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

Questo è tutto!

Il codice sopra funziona nella cartella root public_html. Detto questo, il tuo file laravel principale dovrebbe trovarsi nella cartella public_html, se la tua directory sembra public_html / laravelapp / public e se inserisci il codice sopra in laravelapp non funzionerà. Pertanto è necessario copiare tutti i file principali in public_html e inserire lì il file .htaccess.

Se vuoi mantenere il codice in una sottodirectory, puoi creare un sottodominio, quindi questo codice funzionerà anche per quello.


Ho risposto di seguito prima di leggere la tua risposta e questa deve essere la risposta accettata. Nessuna modifica ai file: solo una regola semplice e intelligente.
Brigo,

@Raham qual è il tuo attuale URL?
Abhinav Saraswat,

2
Voglio solo aggiungere una breve descrizione in cima al lavoro di questo gentiluomo. Il codice sopra funziona sulla cartella root public_html (ho avuto anche problemi). Detto che il tuo file laravel principale dovrebbe trovarsi nella cartella public_html, ho fatto un errore nel fatto che la mia directory sembrava public_html / laravelapp / public se metti il ​​codice sopra dentro laravelapp non funzionerà. Pertanto è necessario copiare tutti i file principali in public_html e inserire lì il file .htaccess. Riferendosi all'hosting centOS e Cpanel per laravel.
Deepesh Thapa,

Quali sono i difetti nell'utilizzo di questo metodo?
Script47

1
Funzionava come un incantesimo per me, avevo solo webshost di cPanel e non potevo cambiare la RootDirectory per Apache. Grazie ! più semplice e sicuro. Ciò non permetterà di vedere il contenuto della cartella principale
Vincent Decaux,

27

Crea il .htaccessfile nella directory principale e inserisci il codice come indicato di seguito.

<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
Consiglio vivamente questa soluzione.
TheLastCodeBender il

1
Consiglio anche questa soluzione
iglesiasedd

Grazie mille. Questo è perfetto (y)
Prappo Islam Prince,

3
funziona benissimo, ma è ancora possibile accedere al file .env direttamente dall'URL.
Manoj Singh,

è una soluzione sicura?
Sr. PHP Programmer Team Lead,

23

1) Non ho trovato un metodo di lavoro per spostare la directory pubblica in L5 . Mentre è possibile modificare alcune cose nel bootstrap index.php, sembra che diverse funzioni di supporto siano basate sul presupposto che quella directory pubblica sia presente. In tutta onestà non dovresti davvero spostare la directory pubblica.

2) Se stai usando MAMP , dovresti creare nuovi vhosts per ogni progetto, ciascuno che serve a proiettare la directory pubblica. Una volta creato, accedi a ciascun progetto con il tuo nome server definito in questo modo:

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

15

È possibile rimuovere l' URL pubblico in laravel5. Segui questi passi:

passaggio 1.copiare tutti i file dal pubblico e incollarli nella directory principale

passaggio 2.Aprire il index.phpfile sostituire con

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

E rimuovi tutta la cache e i cookie.


Ciao, ho provato il tuo metodo, ho eseguito i passaggi precedenti ma mostra i seguenti errori: Avviso: require_once (D: \ Projects \ laravel / public / index.php): impossibile aprire il flusso: nessun file o directory in D: \ Projects \ laravel \ server.php on line 21 Errore irreversibile: require_once (): apertura fallita richiesta 'D: \ Projects \ laravel / public / index.php' (include_path = '.; C: \ xampp \ php \ PEAR' ) in D: \ Projects \ laravel \ server.php sulla linea 21
Ali Shahzad

Questa non è una risposta perfetta, piuttosto è un modo molto insicuro.
Rohit,

11

Supponiamo che tu abbia inserito tutti gli altri file e directory in una cartella denominata "locale".

inserisci qui la descrizione dell'immagine

Basta andare su index.php e trovare queste due righe:

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

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

e cambiali in questo:

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

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

11

Ecco la migliore e più breve soluzione che funziona per me da maggio 2018 per Laravel 5.5

  1. basta tagliare il .htaccessfile dalla directory / public alla directory principale e sostituirlo con il seguente codice:

    <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. Basta salvare il .htaccessfile e questo è tutto.

  3. Rinomina il tuo server.phpfile in index.php. è tutto divertente!


9

MIGLIOR Approccio: non consiglierò di rimuovere pubblico, invece on local computer create a virtual host point to public directorye on remote hosting change public to public_html and point your domain to this directory. Motivo, l'intero codice laravel sarà sicuro perché è un livello fino alla tua directory pubblica :)

METODO 1:

Mi basta rinominare server.phpper index.phpe funziona

METODO 2:

Funziona bene con tutte le versioni di laravel ...

Ecco la mia struttura di directory,

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

Segui questi semplici passaggi

  1. sposta tutti i file dalla directory pubblica a root / laravel /
  2. ora, non c'è bisogno di directory pubblica, quindi facoltativamente puoi rimuoverlo ora
  3. ora apri index.php ed esegui le seguenti sostituzioni

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

per

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

e

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

per

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

  1. ora apri bootstrap / paths.php e cambia il percorso della directory pubblica:

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

per

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

e basta, ora prova http: // localhost / laravel /


Va bene per tutto. ma il comando artisan non funziona, mostra solo "Impossibile aprire il file di input: artisan". C'è qualche suggerimento?
Kabir Hossain,

Questo metodo ha funzionato, se si è in grado di esporre le credenziali del database agli utenti. localhost / laravel / .env
MasoodUrRehman il

8

4 modi migliori per rimuovere pubblico dall'URL.

Se hai usato qualsiasi altro trucco per rimuovere il pubblico dall'URL, cambia il nome di server.php in index.php e cambiando nel percorso del file principale. Chiaramente, non farlo. Allora perché Laravel non dà la soluzione in questo modo perché non è un modo corretto per farlo.

1) Rimuovi il pubblico dall'URL usando htaccess in Laravel

Aggiungendo un file .htaccess nella radice, è possibile accedere al sito Web senza pubblico

<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) Rimuovere il pubblico creando un host virtuale nel proprio locale

Sto dando una demo qui per il sistema operativo Windows. Ma proverò a definire un passaggio in modo che chiunque possa seguirlo facilmente. Puoi anche cercare su Google lo stesso per il particolare sistema operativo.

Passaggio 1: vai su C: \ Windows \ system32 \ drivers \ etc \ apri il file "hosts" in modalità Amministratore.

Passaggio 2: aggiungere il seguente codice ad esso. Qui, ti sto dando una demo della demo del nome di dominio projectname.local, puoi specificare quella che preferisci. Renderlo costante in ogni luogo.

127.0.0.1  projectname.local

Passaggio 3: ora vai a, C:\xampp\apache\conf\extraper gli utenti xampp e per l'utente wamp "C:\wamp\bin\apache\Apache2.4.4\conf\extra"e apri il "httpd-vhosts.conf"file. Ora aggiungi il seguente codice.

Note: modifica la radice del documento secondo il tuo progetto e aggiungi anche il nome di dominio definito nel file "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>

Passaggio 4: ultimo ma il passaggio importante è riavviare Xampp o Wamp e accedere http://projectname.localall'URL come e il tuo Laravel risponderà senza URL pubblico.


3) Rimuovere il pubblico eseguendo il comando in Laravel

Se lavori in locale, non devi fare nulla, devi solo eseguire il seguente comando dal tuo terminale o strumento da riga di comando. Successivamente, puoi accedere al tuo sito Web tramite l'URL fornito dalla riga di comando.

   > php artisan serve

Se si desidera eseguire il proprio progetto su un determinato IP, è necessario eseguire il comando seguente. Se stai lavorando su LAN, se vuoi consentire ad altre persone di accedere al tuo sito Web da locale, devi solo controllare il tuo indirizzo IP utilizzando la riga di comando eseguendo "ipconfig" dopo aver eseguito il tuo indirizzo IP seguendo il comando.

> php artisan serve --host=192.168.0.177

Se si desidera eseguire il progetto su un IP particolare con una porta particolare, è necessario il comando seguente.

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

4) Rimuovere il pubblico sul server ospitato o sul pannello

inserisci qui la descrizione dell'immagine

Dopo il completamento del progetto devi ospitare il progetto sul server, quindi devi solo impostare la radice del documento sul tuo dominio sulla cartella pubblica. Controlla lo screenshot qui sotto.

Come per lo screenshot se non hai alcuna cartella di progetto in public_html, devi solo impostare il root del documento come "public_html/public".

Riferimento preso da qui


1
Tutti e quattro i modi sono buoni, ma ho risolto il mio problema utilizzando la prima soluzione.
Manisha,

7

Vorrei aggiungere a @Humble Learner e notare che la posizione corretta per "correggere" il percorso dell'URL per gli asset è /Illuminate/Routing/UrlGenerator.php/asset ().

Aggiorna il metodo affinché corrisponda:

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, '/');
}

Questo risolverà script, stili e percorsi delle immagini. Qualsiasi cosa per i percorsi delle risorse.


6

Per l'utente XAMPP rimuovere il pubblico dall'URL senza toccare il filesystem predefinito laravel è impostare un host virtuale per la propria applicazione per fare questo jsut attenersi alla seguente procedura

  1. Apri l'applicazione del pannello di controllo XAMPP e ferma Apache. Tieni presente che i computer Windows in ritardo potrebbero eseguirlo come servizio, quindi seleziona la casella a sinistra del modulo Apache.

  2. Passare C:/xampp/apache/conf/extrao dove si trovano i file XAMPP.

  3. Apri il file httpd-vhosts.conf con un editor di testo.

  4. Intorno alla linea 19 trova # NameVirtualHost *:80e decommenta o rimuovi l'hash.

  5. Nella parte inferiore del file incollare il seguente codice:

<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. Ora puoi copiare e incollare il codice sopra riportato per aggiungere le tue directory di host virtuale. Ad esempio, sto lavorando su un sito chiamato Eatery Engine, quindi il frammento seguente mi consentirà di lavorare con sottodomini sulla mia installazione locale:
<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. Quindi vai al tuo file host di Windows per modificare il tuo HOSTS. il file si troverà in C:/Windows/System32/drivers/etc/hosts, dove hosts è il file. Aprilo con il blocco note.
  2. Cercare la risoluzione dei nomi #localhost è gestita all'interno del DNS stesso.

127.0.0.1 localhost

la risoluzione dei nomi localhost è gestita all'interno del DNS stesso.

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. Riavvia Apache e testa tutto.

L'articolo originale può essere trovato qui


5

C'è sempre un motivo per avere una cartella pubblica nell'installazione di Laravel, tutti gli elementi relativi al pubblico dovrebbero essere presenti all'interno della cartella pubblica,

Non puntare il tuo indirizzo IP / dominio sulla cartella principale di Laravel, ma puntalo sulla cartella pubblica. Non è sicuro puntare l'IP del server verso la cartella principale. Perché, a meno che non si scrivano restrizioni .htaccess, si può facilmente accedere agli altri file.,

Basta scrivere la condizione di riscrittura nel .htaccessfile e installare il modulo di riscrittura e abilitare il modulo di riscrittura, il problema che aggiunge il pubblico nella rotta verrà risolto.


3

So che ci sono molte soluzioni per questo problema. La soluzione migliore e più semplice è aggiungere il file .htaccess nella directory principale .

Ho provato le risposte che abbiamo fornito per questo problema, ma ho riscontrato alcuni problemi con auth: api guard in Laravel.

Ecco la soluzione aggiornata:

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

Creare il file .htaccess nella directory principale e aggiungere questo codice. E tutto va bene


2

Laravel 5.5

Dopo aver installato Laravel per la prima volta, ho affrontato il famoso "problema delle cartelle pubbliche" e ho trovato questa soluzione che, a mio parere personale , è "più pulita" rispetto alle altre che ho trovato sul Web.


realizzazioni

  • Non hai publicparole nell'URI
  • Proteggi il .envfile da persone curiose

Tutto può essere fatto semplicemente modificando l' .htaccessutilizzo mod_rewritee quattro semplici regole.


passi

  1. Sposta il .htaccessfile nella public/.htaccessradice principale
  2. Modificalo come di seguito

Ho commentato tutto, quindi dovrebbe essere chiaro (spero) anche a coloro che non hanno mai usato mod_rewrite(non che io sia un esperto, al contrario). Inoltre, per comprendere le regole, deve essere chiaro che, in Laravel, se Bill si connette https://example.com, https://example.com/index.phpè caricato. Questo file contiene solo il comando header("refresh: 5; https://example.com/public/"), a cui invia la richiesta https://example.com/public/index.php. Questo secondo index.phpè responsabile del caricamento del controller e di altre cose.

# 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 seguente regola (originariamente in public/.htaccess) può essere eliminata. La stessa regola, infatti, è esplicitata in modo più dettagliato nelle ultime due regole.

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

EDIT: mi mancava la soluzione di Abhinav Saraswat e la sua risposta dovrebbe essere quella accettata. Solo una regola semplice e chiara che reindirizza tutto il traffico alla cartella pubblica senza modificare alcun file.


2

Innanzitutto puoi usare questi passaggi

Per Laravel 5:

1. Rinominare server.php nella cartella principale di Laravel in index.php

2. Copiare il file .htaccess dalla directory / public nella cartella principale di Laravel.

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

dopo aver seguito questi passaggi, è necessario modificare tutti i percorsi CSS e di script, ma questo sarà stancante.

Proposta di soluzione : semplicemente è possibile apportare modifiche minori alla helpers::assetfunzione.

Per questo :

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

  2. vai alla linea 130

  3. scrivi "public/".$pathinvece di $path,

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

2
Regola numero 1: non modificare mai un file principale. Anche se adesso sembra facile e carino, pagherai più tardi.
Janaka Dombawela,

@JanakaDombawela non la penso così perché:
Ferhat KOÇER il

@JanakaDombawela Non la penso così perché: Senerio 1: se lo sviluppatore è esperto: il codice open source è per questo lavoro Senerio 2: se lo sviluppatore è un minore, lo sviluppatore deve
apportare

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>

Attiva il modulo mod_rewrite con

sudo a2enmod rewrite

e riavvia l'apache

sudo service apache2 restart

Per utilizzare mod_rewrite dai file .htaccess (che è un caso d'uso molto comune), modifica il VirtualHost predefinito con

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

Sotto "DocumentRoot / var / www / html" aggiungi le seguenti righe:

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

Riavvia di nuovo il server:

sudo service apache2 restart

1

Ho già letto qualche articolo prima e funziona benissimo, ma davvero non so se sia sicuro o meno

    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. 

Modifica index.php

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

per

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

1

Anche se non consiglio di mettere Laravel nella cartella principale, ci sono alcuni casi in cui non è stato possibile evitarlo; per quei casi i metodi sopra indicati non funzionano per gli asset, quindi ho fatto una soluzione rapida cambiando htaccess: dopo aver copiato server.php in index.php, modifica il file .htaccess in questo modo:

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

Questa è stata una soluzione rapida che ho dovuto fare, quindi chiunque è invitato ad aggiornarlo.


1

Il problema è se si digita / public e sarà ancora disponibile nell'URL, quindi ho creato una correzione che dovrebbe essere collocata in 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;
   }}

questa pace di codice rimuoverà il pubblico dall'URL e darà un 404 e quindi reindirizzerà all'URL senza il pubblico


0

Un altro metodo che uso è quello di creare un collegamento simbolico (in Linux, non so di Win) usando il comando ln in htdocs o www cioè ln projectname/public project Il sito è quindi accessibile tramite localhost / project


0

Puoi rimuovere la parola chiave pubblica dall'URL usando vari metodi.

1) Se si utilizza l'hosting dedicato e si dispone dell'accesso root, è possibile rimuovere la parola chiave pubblica dall'URL utilizzando Virtual Host. Dovresti dare il percorso DocumentRoot con pubblico. Quindi questo avvierà l'indice dalla directory pubblica e lo rimuoverà dall'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) Se non si dispone dell'accesso root dell'hosting, è necessario creare un nuovo file .htaccess nella directory principale e inserire il codice come di seguito

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

Puoi ottenere maggiori riferimenti qui.


0

Crea il file .htaccess nella directory principale e inserisci il codice come indicato di seguito.

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

Crea il file .htaccess nella directory / public e inserisci il codice come sotto.

<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

Ho trovato la soluzione più efficace a questo problema.

Modifica il tuo .htaccessnella cartella principale e scrivi il seguente codice. Nient'altro richiesto

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

ho provato qualche soluzione qui e ho trovato htaccess che funziona con laravel 5.2, in questo modo:

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]

quando hai un altro file o cartella da proibire basta aggiungere

RewriteRule ^your_file - [F,L,NC]

-1

Non devi fare molto, basta creare un file .htaccess nella directory principale e incollare / salvare il seguente;

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

Questo mi reindirizza a / public / public
zanderwar il

@zanderwar, per favore qual è la versione di Laravel? Inoltre, spero che tu non abbia il tuo progetto in una sottodirectory dalla directory principale?
Victor Ifeanyi Ejiogu,

Il progetto è root, la versione è 5.6. * - Tuttavia, si trova su un sottodominio, su hosting condiviso; sfortunatamente questa installazione di cPanel impone ai sottodomini di avere una cartella all'interno di public_html
zanderwar,
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.