back to top

Gestire le intestazioni: la funzione header() di PHP

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.

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).
Articolo precedente
Articolo successivo