Laravel 5 - Rimuovi pubblico dall'URL
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:
- Funziona con L5
- 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
Per Laravel 5:
- Rinomina
server.phpnella cartella principale di Laravel inindex.php - Copia il
.htaccessfile dalla/publicdirectory alla cartella principale di Laravel.
Questo è tutto!
Ho risolto il problema utilizzando 2 risposte:
- Rinominare il server.php in index.php (nessuna modifica)
- Copia il .htaccess dalla cartella pubblica alla cartella principale (come rimon.ekjon detto sotto)
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
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.
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>
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.
@ 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.
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>
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.
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
È 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.
Ecco la soluzione migliore e più breve che funziona per me a partire da maggio 2018 per Laravel 5.5
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>Basta salvare il
.htaccessfile e questo è tutto.Rinomina il tuo
server.phpfile inindex.php. questo è tutto divertiti!
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';
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
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
- sposta tutti i file dalla directory pubblica a root / laravel /
- ora, non c'è bisogno di una directory pubblica, quindi opzionalmente puoi rimuoverlo ora
- 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';
- 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 /
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.
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
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.
Naviga verso
C:/xampp/apache/conf/extrao ovunque si trovino i tuoi file XAMPP.Apri il file denominato httpd-vhosts.conf con un editor di testo.
Intorno alla riga 19 trova #
NameVirtualHost *:80e decommenta o rimuovi l'hash.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>
- 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>
- 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. - 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.
- Riavvia Apache e prova tutto.
L'articolo originale può essere trovato qui
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.
<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
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
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>
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.
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
- Sposta il
.htaccessfile nellapublic/.htaccessradice principale - 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.
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 :
Aperto
vendor\laravel\framework\src\Illuminate\Foundation\helpers.phpvai alla riga 130
scrivi
"public/".$pathinvece di$path,function asset($path, $secure = null){ return app('url')->asset("public/".$path, $secure); }
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';
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
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
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.
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
Puoi farlo semplicemente in 2 semplici passaggi
Rinomina il tuo
server.phpfile nella directory principale del tuo progetto laravel.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]
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