Se dopo aver costruito la tua app con Laravel hai l’esigenza di trasferirla su un hosting condiviso, le prossime righe potrebbero interessarti.
E’ frequente ormai l’uso di servizi di cloud hosting in cui coesistono diverse realtà: ad esempio potremmo ritrovarci a far “convivere” un’installazione di WordPress insieme ad una di Drupal e/o di altri CMS/Framework. Come puoi ben immaginare per ogni CMS/ Framework esiste un servizio più o meno ottimizzato nel quale far girare la nostra applicazione: un esempio, ma non l’unico, è Fortrabbit (o Forge) per Laravel.
Tralasciando questo aspetto più commerciale che tecnico, andiamo subito all’argomento: come installare un’applicazione fatta con Laravel all’interno di un hosting condiviso.
Darò per scontato che le caratteristiche di sistema di cui Laravel ha bisogno:
* Versione di PHP >= 5.4
* Estensione MCrypt di PHP
siano rispettate.
Vediamo ora su che tipo di scenario andremo ad operare: prenderò in considerazione una struttura comune che puoi ritrovare all’interno dei vari servizi di hosting. E’ chiaro che devi valutare tutto in maniera critica rapportando questo articolo alla tua situazione particolare.
Tipicamente puoi trovarti di fronte una struttura simile a questa:
config/
logs/
www/
sito1/
sito2/
sito3/
…
Secondo questa struttura, ogni cartella dentro /www
conterrà un’applicazione.
Ognuna di queste viene detta “DocumentRoot” e, in genere, è la cartella a cui il dominio deve puntare per eseguire l’applicazione.
Un esempio per chiarire: quando digito sulla barra degli indirizzi www.sito1.it, il contenuto da eseguire verrà preso all’interno di /www/sito1 e così per gli altri. La DocumentRoot per Laravel è la cartella /public
. Questo significa che il dominio deve far riferimento a /public
per eseguire l’applicazione.
Nell’hosting condiviso, a volte, non possiamo impostare la cartella /public
come DocumentRoot, ma ci troviamo di fronte ad una struttura predefinita (come quella che stiamo considerando) o poco malleabile.
Cosa fare in questi casi?
Ci sono tre possibili diversi approcci al problema. Vediamoli insieme.
Spostare il contenuto della cartella /public
nella DocumentRoot
Supponiamo di voler installare la nostra applicazione fatta con Laravel all’interno di /www/sito1.
Considerando la struttura descritta sopra, crea una cartella chiamata /laravelsito1 all’interno della webroot e caricaci dentro tutte le cartelle e i files dell’applicazione: /vendor, /app, /bootstrap e i vari files.
Dovresti avere una situazione simile a questa:
config/
laravelsito1/
app/
bootstrap/
vendor/
…
logs/
www/
sito1/
sito2/
sito3/
…
Ora effettua l’upload del contenuto della cartella /public
all’interno di /www/sito1.
Quello che otterrai sarà simile a:
config/
laravelsito1/
app/
bootstrap/
vendor/
…
logs/
www/
sito1/
packages/
.htaccess
index.php
…
A questo punto è d’obbligo fare un pò di configurazione.
Vai al file bootstrap/paths.php e alla riga:
‘public’ => DIR.’/../public’,
cambia il path in:
‘public’ => DIR.’/../../www/sito1′,
dopodiché apri il file www/sito1/index.php e modifica queste righe:
require DIR.’/../bootstrap/autoload.php’;
$app = require_once DIR.’/../bootstrap/start.php’;
con queste:
require DIR.’/../../laravelsito1/bootstrap/autoload.php’;
$app = require_once DIR.’/../../laravelsito1/bootstrap/start.php’;
Con questa ultima configurazione hai terminato.
Questo metodo è elegante e pulito ed è quello che ti incoraggio a seguire poiché mantiene fuori da potenziali attacchi l’applicazione.
Usare .htaccess con mod_rewrite
Un’altro approccio, più semplice ma meno raccomandato, è quello di dare delle direttive all’interno del file .htaccess. Vediamo come.
Carica l’intera applicazione all’interno della DocumentRoot: considerando il nostro scenario dovrai caricare tutte le cartelle e i files (compresa la cartella /public
) all’interno di /www/sito1.
La struttura sarà simile alla seguente:
config/
logs/
www/
sito1/
app/
bootstrap/
public/
packages/
.htaccess
index.php
…
vendor/
…
sito2/
sito3/
…
Ora crea un file .htaccess all’interno di /www/sito1, aprilo con un editor di testo ed inserisci le seguenti righe:
RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]
Potrai chiederti: cosa ho scritto? Semplice, non hai fatto altro che dirottare tutte le richieste del dominio www.sito1.it all’interno della cartella /www/sito1/public terminando così l’operazione.
Questo metodo è più veloce del precedente ma, senza entrare nello specifico, è sconsigliato per motivi di sicurezza: il core e la cartella pubblica si trovano allo stesso livello e questo può rendere l’applicazione vulnerabile ad attacchi esterni.
Eliminare la cartella /public spostando tutto nella DocumentRoot
Simile al precedente. Fai l’upload di tutto il progetto nella cartella /www/sito1, sposta il contenuto della cartella /public
allo stesso livello di /app, /vendor /bootstrap e gli altri file ed elimina la cartella /public
.
Dovresti avere una cosa simile a questa:
config/
logs/
www/
sito1/
app/
bootstrap/
public/
packages/
.htaccess
index.php
…
vendor/
…
sito2/
sito3/
Ora apri il file bootstrap/paths.php e
modifica questa riga
‘public’ => DIR.’/../public’,
così:
‘public’ => DIR.’/..’,
Infine apri l’index.php e modifica queste linee
require DIR.’/../bootstrap/autoload.php’;
$app = require_once DIR.’/../bootstrap/start.php’;
in questo modo
require DIR.’/bootstrap/autoload.php’;
$app = require_once DIR.’/bootstrap/start.php’;
E’ tutto! Te la sei cavata con poco, tutto sommato.
Analogalmente a quanto detto per il secondo metodo, anche questo mantiene il core dell’applicazione insieme ai file della cartella pubblica e quindi anche questo metodo, sepppur veloce da realizzare non è quello migliore.
Conclusioni
Come hai potuto vedere ci sono diversi modi di installare Laravel su un hosting condiviso.
Gli ultimi due, come già detto, sono più veloci e meno “invasivi” da realizzare ma quello raccomandato per motivi di sicurezza è il primo.
È tutto, alla prossima!