Una funzione particolarmente utile ed interessante del PHP รจ sicuramente header(). Grazie a questa funzione, infatti, รจ possibile aggiungere delle intestazioni addizionali a quelle normalmente scambiate tra il server ed il client.
Cosa sono gli headers
Gli headers (o "intestazioni" in italiano) sono delle meta-informazioni che vengono scambiate tra il server ed il client. Queste informazioni, che sono totalmente invisibili per lโutente (nel senso che non producono alcun output), possono essere indispensabili (nel senso che in mancanza la comunicazione non potrebbe funzionare correttamente) oppure puramente informative.
Tra queste informazioni vi sono, ad esempio, lโindicazione della risorsa richiesta e del protocollo utilizzato, le informazioni circa lโencoding ed il charset del documento, indicazione dello user-agent, eventuale referrer, ecc.
Vediamo un esempio di headers scambiati preliminarmente alla visualizzazione di una pagina web come questa:
GET /php/funzione-header_11798.html HTTP/1.1 Host: www.mrwebmaster.it User-Agent: Mozilla /5.0 (Compatible MSIE 9.0;Windows NT 6.1;WOW64; Trident/5.0) Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7 Cache-Control: no-cache
Gli headers, come potete vedere, sono formattati in questo modo:
NomeHeader: Valore (CRLF)
Non รจ previsto un ordine arbitrario per gli headers, quindi non รจ importante in quale ordine vengono inviati.
Diverse tipologie di headers
Gli headers possono essere suddivisi in quattro tipologie:
- General Headers (contengono informazioni generali come, ad esempio, lo stato della cache)
- Request Headers (sono richieste inviate dal browser)
- Response Headers (sono le risposte del server)
- Entity Headers (contengono meta-informazioni sullโentitร โ file โ trasferito)
Inviare headers con PHP
Come abbiamo detto, tramite PHP รจ possibile arricchire lo scambio di informazioni tra il server ed il client, aggiungendo ulteriori meta-informazioni settate arbitrariamente dallo sviluppatore.
Lavorando con la funzione headers(), tuttavia, รจ bene tenere a mente una caratteristica molto importante degli headers: le intestazioni, infatti, devono essere inviate necessariamente prima dellโoutput. In caso contrario PHP restituirร un errore di questo tipo:
Cannot modify header information - headers already sent by...
In poche parole, la definizone degli headers deve avvenire prima dellโinvio di un qualsiasi altro dato attraverso, ad esempio, echo o print o attraverso lโinclusione di un qualche file HTML.
Alcuni esempi di utilizzo della funzione headers() di PHP
Grazie a questa funzione possiamo fare cosa molto interessanti. Vediamo di seguito, molto brevemente, alcune casiste piuttosto comuni:
Gestire redirect con PHP
Ad esempio possiamo effettuare un redirezionamento dellโutente (cioรจ trasferirlo automaticamente da una pagina allโaltra).
header('Location: http://www.sito.it/nuova-pagina.html');
Eโ anche possibile accompagnare il redirect con un messaggio di stato HTTP, ad esempio:
// pagina web spostata in modo permanente
header('HTTP/1.1 301 Moved Permanently');
// redirect dell'utente
header('Location: http://www.sito.it/nuova-pagina.html');
Per approfondire lโargomento vi suggerisco di dare una lettura a questo articolo dedicato, appunto, ai redirect con PHP.
Disabilitare la cache del brwoser
Attraverso lโinvio delle giuste intestazioni รจ possibile disabilitare la cache del browser ed evitare che i contenuti del nostro sito vengano memorizzati in locale sul computer dellโutente. Una simile scelta diventa necessaria quando il contenuto di una pagina รจ soggetto a continui cambiamenti. Vediamo un esempio di codice PHP:
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Pragma: no-cache');
Per maggiori informazioni vi invito a leggere questo articolo che spiega come disabilitare la cache del brwoser con PHP.
Specificare un Content-Type
Oppure possiamo specificare un content-type conforme al tipo di output che vogliamo produrre (si pensi, ad esempio, alla produzione dinamica di immagini attraverso lโuso di codice PHP). In questo caso il codice da usare sarร qualcosa del genere:
// Content-Type per immagini JPG
header('Content-Type: image/jpeg');
// Content-Type per immagini PNG
header('Content-type: image/png');
// Content-Type per immagini GIF
header('Content-Type: image/gif');
Ovviamente questo non riguarda solo le immagini ma ogni altro tipo di file come, ad esempio, archivi compressi, file audio, video, ecc.
Creare pagine di errore dinamiche
Eโ possibile inviare anche messaggi di stato HTTP, cosa molto utile quando si gestiscono dinamicamente le pagine di errore. Vediamo qualche esempio:
// pagina non trovata
header('HTTP/1.1 404 Not Found');
// accesso vietato alla risorsa
header('HTTP/1.1 403 Forbidden');
// errore interno del server
header('HTTP/1.1 500 Internal Server Error');
Forzare il download di un file
Attraverso la funzione header() possiamo dire al browser di scaricare un certo documento invece di aprirlo:
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="brano.mp3"');
header('Content-Transfer-Encoding: binary');
readfile('brano.mp3');
Per maggiori informazioni vi invito a leggere questo breve articolo.
Conclusioni
Grazie a questa funzione di PHP รจ possibile intervenire su aspetti non visuali ma molto importanti di unโapplicazione. Conoscere il funzionamento delle intestazioni e saper utilizzare correttamente la funzione header(), pertanto, รจ indispensabile per chiunque desideri sviluppare progetti web.
Nella prossima lezione vedremo una forma particolare di headers, cioรจ lโinvio di cookie attrasverso le apposite funzioni native di PHP per la gestione di questo importante strumento di navigazione.