In questo articolo guida vedremo come rimuovere /public dall’URL di un’applicazione Laravel.
Esistono molti framework PHP in circolazione ma uno dei più famosi è sicuramente Laravel.
Quando mi avvicinai a Laravel per la prima volta però dovetti affrontare molti piccoli ostacoli:
- Nomenclatura di file e classi che se non rispettata non lascia funzionare l’applicazione a dovere (creando anche molta confusione e mal di testa)
- Comprensione della struttura del progetto
- Comprensione ed utilizzo delle Queues (letteralmente code)
- Molto altro
Uno dei problemi però che mi trovai ad affrontare solo nel momento di pubblicare l’applicazione in produzione fu quello di rimuovere /public dall’URL.
Eh già, vi sarete accorti che l’entrypoint di un’applicazione Laravel è proprio il file ./public/index.php nella omonima subdirectory del progetto.
Perché rimuovere /public?
Ma perché rimuovere questo /public dall’URL di un’applicazione Laravel è così importante?
Si potrebbe pensare che in fondo non è così fastidioso, che l’effort necessario a rimuoverlo forse non vale la candela.
E invece è molto importante rimuoverlo e di seguito trovate i tre principali motivi:
- È antiestetico, perché anche gli URL hanno bisogno di cura estetica
- È poco SEO-friendly, ovvero non aiuta a migliorare la SEO del nostro sito che prevede degli URL quanto più parlanti possibile
- Espone il nostro sito a rischi di sicurezza
Ma allora perché Laravel ha messo il proprio entrypoint dentro ./public ?
Come mai ./public/index.php come entrypoint?
A molti di voi a questo punto sarà sorta questa domanda: “ma perché mai gli sviluppatori di Laravel hanno deciso di mettere il nostro entrypoint all’interno della cartella public? Perché non mettere index.php all’interno della cartella root del progetto?”.
Potrebbe sembrare una scelta stupida, che complica il lavoro, ma la risposta è tutt’altro che stupida.
La risposta è una ed una sola: sicurezza. Sicurezza? E perché mai?
Esatto, infatti se il nostro entrypoint non fosse dentro la cartella public ma all’interno della cartella root del progetto gli utenti potrebbero tranquillamente fare richiesta di leggere tutti i file allo stesso livello di index.php e tra i file sullo stesso livello abbiamo il famigerato .env, il file incaricato di contenere tutte le nostre credenziali, tra le quali quelle del Database.
Esiste una risposta molto popolare su Stackoverflow che per risolvere il “problema” invita l’utente a spostare il file .htaccess da ./public alla root del progetto e a rinominare il file server.php in index.php trasformandolo nell’entrypoint della nostra applicazione
Potete trovare la risposta a questo link: https://stackoverflow.com/a/28735930/2569789
Probabilmente anche grazie a questa risposta popolare adesso ci sono un sacco di siti su Google esposti a potenziali attacchi.
Vi invito ad aprire una nuova finestra di Google ed eseguire questa ricerca:
filetype:env DB_USERNAME
Adesso cliccate su uno dei risultati ma mi raccomando, non fate i birichini 😉
Ma allora perché nel capitolo precedente, tra i 3 punti ho detto che /public mette a repentaglio la sicurezza del sito?
Beh, perché se l’applicazione risponde a miodominio.it/public vuol dire che il file .env è comunque raggiungibile semplicemente scrivendo miodominio.it/.env (ho rimosso /public spostandomi indietro di una cartella ed ho selezionato il file .env).
In realtà /public è una sicurezza, ma gli sviluppatori di Laravel hanno lasciato a noi il compito di far puntare miodominio.it alla cartella /public e non alla root del progetto!
La soluzione
La soluzine a questo problema è semplice.
Quello che dobbiamo fare è istruire il nostro WebServer a redirigere il nostro traffico all’interno della cartella public.
Per fare ciò dobbiamo modificare il file di configurazione del nostro WebServer.
Vediamo come fare in base al WebServer che state utilizzando
Apache
Nel caso di Apache il file da modificare è /etc/apache2/sites-available/000-default.conf.
Nel file cercate la riga che inizia con DocumentRoot, potrebbe essere qualcosa del tipo:
DocumentRoot /var/www/html
lla fine della cartella indicata. Seguendo l’esempio di sopra verrebbe:
DocumentRoot /var/www/html/public
Salvate le modifiche e riavviate Apache con il seguente comando:
$ sudo service apache2 restart
Nginx
Nel caso di Nginx solitamente il file da modificare è /etc/nginx/sites-enabled/default.
Nel file cercate la riga che inizia con root, potrebbe essere qualcosa del tipo:
root /var/www/html
Adesso aggiungete /public alla fine della cartella indicata. Seguendo l’esempio di sopra verrebbe:
root /var/www/html/public
Salvate le modifiche e riavviate Nginx con il seguente comando:
$ sudo service nginx restart
Conclusioni
Rimuovere /public da un URL di Laravel può sembrare complicato, in rete si trovano molte soluzioni, alcune molto “artistiche” per così dire.
La soluzione proposta in questa guida però è semplice e sicura e, oserei dire, la più “corretta”.