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.