Laravel 5 - Rimuovi pubblico dall'URL

Feb 06 2015

So che questa è una domanda molto popolare, ma non sono riuscito a trovare una soluzione funzionante per Laravel 5. Ho provato a migrare da Codeigniter per molto tempo, ma questo processo di installazione contorto continua a scoraggiarmi.

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

Non voglio impostare la mia root del documento sulla cartella pubblica, anche questo è imbarazzante 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 un'eccezione Laravel NotFoundHttpException nella riga compiled.php 7610.

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

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

  1. Funziona con L5
  2. Mi consente di passare da un progetto all'altro con facilità (di solito sto lavorando su 2 o 3 alla volta).

Grazie

** Sto usando MAMP e PHP 5.6.2

Risposte

445 AsfaqTamim Feb 26 2015 at 13:32

Per Laravel 5:

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

Questo è tutto!

131 ka_lin Sep 15 2015 at 14:57

Ho risolto il problema utilizzando 2 risposte:

  1. Rinominare il 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 la statistica:

    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

127 DerkJanSpeelman Nov 28 2018 at 17:13

NON FARE!

NON DEVI DAVVERO rinominare server.phpnella cartella principale di Laravel index.php e copiare il .htaccessfile dalla /publicdirectory alla cartella principale di Laravel !!!

In questo modo tutti possono accedere ad alcuni dei tuoi file ( .envad esempio). Prova tu stesso. Non lo vuoi!


FARE

Invece, dovresti creare un .htaccessfile nella tua root come questo:

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

Questo riscriverà silenziosamente tutti i tuoi URI di base nella /publiccartella. Anche tutte le intestazioni , ad esempio l'intestazione di autorizzazione HTTP , e tutti i parametri URI facoltativi verranno trasmessi silenziosamente alla /publiccartella.

È tutto

Nota quando imposti un progetto Laravel con Docker: non avrai bisogno di fare nulla di tutto questo.

106 Raham Jan 29 2018 at 11:11

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>
44 MuhammadSadiq Apr 29 2015 at 18:00

Un modo semplice per rimuovere public dall'URL di laravel 5. Devi solo tagliare index.php e .htaccess dalla directory pubblica e incollarlo nella directory principale, questo è tutto 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 in quanto potrebbero avere problemi nella configurazione dell'host virtuale e la soluzione migliore è configurare l'host virtuale sulla macchina locale e indirizzarlo alla directory pubblica del progetto.

40 Miron Sep 11 2015 at 16:16

@ rimon.ekjon ha detto:

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

Per me funziona. Ma tutti i file di risorse nella directory / public non sono stati in grado di 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 funziona tutto :)

Grazie @ rimon.ekjon e tutti voi.

Aggiornamento dell'autore 2020

Questa risposta non è consigliata. Si consiglia invece di gestire il .htaccessfile.

32 PallavNagar Jan 20 2019 at 16:42

Crea .htaccessfile nella directory principale e inserisci 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>
30 AbhinavSaraswat Dec 12 2017 at 18:57

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

<IfModule mod_rewrite.c>
    RewriteEngine On

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

Questo è tutto!

Il codice precedente funziona nella cartella root public_html. Detto questo, il tuo file laravel principale dovrebbe essere all'interno della cartella public_html, se la tua directory assomiglia a public_html / laravelapp / public e se metti il ​​codice sopra all'interno di laravelapp non funzionerà. Quindi devi copiare tutti i tuoi file core in public_html e mettere lì il file .htaccess.

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

23 JeremySchaffer Feb 08 2015 at 08:38

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

2) Se stai usando MAMP , dovresti creare nuovi vhost per ogni progetto, ognuno dei quali serve che proietta la directory pubblica. Una volta creato, accedi a ciascun progetto con il nome del server definito in questo modo:

http://project1.dev
http://project2.dev
15 piyushpatel Feb 11 2015 at 15:17

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

passaggio 1.copiare tutti i file da public e incollarli nella directory principale

passaggio 2.open 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.

12 tonypro May 17 2018 at 16:46

Ecco la soluzione migliore e più breve che funziona per me a partire 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. questo è tutto divertiti!

11 AngeloJosephSalvador Feb 19 2015 at 22:39

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

Vai su index.php e trova 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 MayankDudakiya Apr 15 2019 at 19:48

4 modi migliori per rimuovere public dall'URL.

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

1) Rimuovi public dall'URL usando htaccess in Laravel

Aggiungendo un file .htaccess nella root, puoi 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) Rimuovi il pubblico creando un host virtuale nel tuo locale

Sto dando una demo qui per il sistema operativo Windows. Ma cercherò di 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: aggiungi il codice seguente. Qui, ti sto dando una demo della demo del nome di dominio projectname.local, puoi specificarne uno come preferisci. Rendilo 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 al suo interno.

Note: Cambia la radice del documento secondo il tuo progetto e aggiungi anche il nome di dominio come 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 stai lavorando in locale, non devi fare nulla, devi solo eseguire il seguente comando dal tuo terminale o dallo strumento della riga di comando. Successivamente, puoi accedere al tuo sito Web tramite l'URL fornito dalla riga di comando.

   > php artisan serve

Se sei disposto a eseguire il tuo progetto su un IP particolare, devi eseguire il seguente comando. 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 usando 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 sei disposto a eseguire il tuo progetto su un IP particolare con una porta particolare, devi eseguire il seguente comando.

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

4) Rimuovere il pubblico sul server ospitato o sul cpanel

Dopo il completamento del progetto è necessario ospitare il progetto sul server, quindi è sufficiente impostare la radice del documento nel dominio sulla cartella pubblica. Controlla lo screenshot qui sotto.

Come da screenshot, se non hai alcuna cartella di progetto in public_html, devi solo impostare la radice del documento come "public_html/public".

Riferimento tratto da qui

9 WasimA. Sep 14 2016 at 19:16

Approccio MIGLIORE: non consiglierò di rimuovere public, 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, il tuo intero codice laravel sarà sicuro perché è di un livello fino alla tua directory pubblica :)

METODO 1:

Ho appena rinominato server.phpin index.phpe funziona

METODO 2:

Funziona bene per 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 una directory pubblica, quindi opzionalmente puoi rimuoverlo ora
  3. ora apri index.php e fai le seguenti sostituzioni

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

per

richiedono 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 questo è tutto, ora prova http: // localhost / laravel /

7 SeanPerkins Nov 02 2015 at 10:10

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

Aggiorna il metodo in modo che 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, '/');
}

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

6 sunnykashyap Jul 19 2016 at 23:47

Affinché l'utente XAMPP rimuova public dall'URL senza toccare il filesystem predefinito di laravel, è necessario impostare un host virtuale per la tua applicazione per farlo, ma segui questi passaggi

  1. Apri l'applicazione del pannello di controllo XAMPP e arresta Apache. Tieni presente che le ultime macchine Windows potrebbero eseguirlo come servizio, quindi seleziona la casella a sinistra del modulo Apache.

  2. Naviga verso C:/xampp/apache/conf/extrao ovunque si trovino i tuoi file XAMPP.

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

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

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

<VirtualHost *>
    ServerAdmin [email protected]
    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 qui sotto per aggiungere le directory del tuo host virtuale. Ad esempio, sto lavorando su un sito chiamato Eatery Engine, quindi il seguente frammento mi consentirà di lavorare con i sottodomini sulla mia installazione locale:
<VirtualHost eateryengine.dev>
    ServerAdmin [email protected]
    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 i tuoi HOSTS. il file si troverà in C:/Windows/System32/drivers/etc/hosts, dove hosts è il file. Aprilo con il blocco note.
  2. Cerca la risoluzione dei nomi #localhost è gestita all'interno del DNS stesso.

127.0.0.1 localhost

la risoluzione dei nomi localhost viene 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 prova tutto.

L'articolo originale può essere trovato qui

5 ReiahPaulSam Apr 19 2017 at 17:29

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

Non puntare il tuo indirizzo IP / dominio alla cartella principale di Laravel ma puntalo alla cartella pubblica. Non è sicuro puntare l'IP del server alla cartella principale., Perché a meno che non si scrivano restrizioni .htaccess, è possibile accedere facilmente 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 pubblico nel percorso verrà risolto.

3 mujuonly Apr 03 2019 at 19:01
<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 dall'interno dei 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
3 CHARITRASHRESTHA Nov 06 2019 at 11:19

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

Crea il file .htaccess nella tua directory principale e aggiungi questo codice. E va tutto bene

3 GhanshyamNakiya Jun 19 2020 at 13:05

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

<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>
2 Plokko Sep 14 2017 at 03:12

Anche se sconsiglio di mettere Laravel nella cartella principale, ci sono alcuni casi in cui non è stato possibile evitarlo; per questi casi i metodi sopra non funzionano per le risorse, 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 era una soluzione rapida che dovevo fare, quindi chiunque è il benvenuto per aggiornarlo.

2 Brigo Jan 27 2018 at 23:36

Laravel 5.5

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


Realizzazioni

  • Non avere publicparole nell'URI
  • Proteggi il .envfile dai curiosi

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 chi non l'ha mai usato mod_rewrite(non che io sia un esperto, tutto il contrario). Inoltre, per capire le regole, deve essere chiaro che, in Laravel, se Bill si connette a https://example.com, https://example.com/index.phpviene caricato. Questo file contiene solo il comando header("refresh: 5; https://example.com/public/"), che invia la richiesta a 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: Ho perso la soluzione di Abhinav Saraswat e la sua risposta dovrebbe essere quella accettata. Una sola, semplice e chiara regola che reindirizza tutto il traffico alla cartella pubblica senza modificare alcun file.

2 FerhatKOÇER Aug 15 2018 at 04:19

Innanzitutto puoi utilizzare questi passaggi

Per Laravel 5:

1. Rinomina 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 CSS e il percorso di script, ma questo sarà stancante.

Proposta di soluzione : semplicemente puoi apportare piccole modifiche alla helpers::assetfunzione.

Per questo :

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

  2. vai alla riga 130

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

    function asset($path, $secure = null){
       return app('url')->asset("public/".$path, $secure);
    }
    
1 YousefAltaf Feb 10 2017 at 22:31

Ho letto qualche articolo prima e funziona bene 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 il file 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 PaulDeZwaan Aug 14 2019 at 01:52

Il problema è che se digiti / public e sarà ancora disponibile nell'URL, quindi ho creato una correzione che dovrebbe essere posizionata 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à public dall'URL e darà un 404 e quindi reindirizzerà all'URL senza il pubblico

EliMakumba Nov 15 2016 at 22:26

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

VinodJoshi Dec 27 2018 at 13:49

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

1) Se si utilizza un hosting dedicato e si dispone dell'accesso root, è possibile rimuovere la parola chiave pubblica dall'URL utilizzando l'host virtuale. Dovresti dare a DocumentRoot il percorso con public. Quindi questo avvierà l'indice dalla directory pubblica e lo rimuoverà dall'URL.

<VirtualHost *:80>
    ServerAdmin [email protected]
    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 al proprio hosting, è necessario generare 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 ulteriori riferimenti qui.

newbdeveloper Sep 27 2020 at 06:25

Crea un file .htaccess nella tua directory principale e incolla il codice seguente. Questo è tutto: P

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

DeepakRana Aug 10 2020 at 20:01

Puoi farlo semplicemente in 2 semplici passaggi

  1. Rinomina il tuo server.phpfile nella directory principale del tuo progetto laravel.

  2. crea un .htaccessfile nella directory principale e incolla il codice seguente al suo interno

Options -MultiViews -Indexes

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

AbdAbughazaleh Nov 01 2020 at 15:12

Crea un nuovo file chiamato .htaccessnella cartella principale del progetto e inserisci il codice seguente al suo interno:

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

Nota: se sei cambiato server.phpin index.phpdovresti anche rinominarlo nel codice sopra