Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Header HTTP e PHP: come gestirli

Come gestire gli header delle pagine Web con PHP: esempi pratici per tutte le esigenze
Come gestire gli header delle pagine Web con PHP: esempi pratici per tutte le esigenze
Link copiato negli appunti

Gli headers (letteralmente 'intestazioni') trasmessi attraverso il protocollo HTTP (Hyper Text Transfer Protocol) non sono altro che delle informazioni prodotte dall'interazione tra il browser del client che invia delle richieste e il server che le raccoglie e invia delle risorse in risposta ad esse. PHP integra alcune funzioni utili per la gestione degli headers delle pagine Internet, nel corso di questa trattazione ne descriveremo alcune ponendo particolare attenzione agli aspetti pratici del loro utilizzo.

HTTP Request headers e response headers

Fondamentalmente esistono due tipologie di headers:

  • headers relativi alla richiesta request headers
  • headers relativi alla risposta response headers

Un modo molto semplice di visualizzare gli headers inviati in richiesta da una pagina Web è quello di utilizzare la funzione getallheaders(), messa a disposizione da PHP; questa funzione ha il compito di produrre in output un array in cui sono contenute tutte le informazioni relative agli headers inviati in input.

Si osservi l'esempio seguente:

<?php
# chiamata alla funzione per la raccolta dei request headers 

# visualizzazione dei valori dell'array tramite ciclo

Il breve codice appena proposto permette di mostrare gli headers inseriti in un array tramite la funzione getallheaders() utilizzando un semplice ciclo foreach; nella postazione in cui è stato scritto questo articolo la sua esecuzione ha restituito i seguenti risultati:

[Accept] = text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
[Accept-Charset] = ISO-8859-1,utf-8;q=0.7,*;q=0.7
[Accept-Encoding] = gzip,deflate
[Accept-Language] = it-it,it;q=0.8,en-us;q=0.5,en;q=0.3
[Cache-Control] = max-age=0
[Connection] = keep-alive
[Cookie] = dbx-pagemeta=grabit:0-|1+|2-|3+|5-|6+|7+|4+&advancedstuff:0-; dbx-postmeta=grabit:0+|1+|2+|3+|4+|5+|6+&advancedstuff:0-|1-|2-
[Host] = localhost
[Keep-Alive] = 300
[Referer] = http://localhost/mail/
[User-Agent] = Mozilla/5.0 (Windows; U; Windows NT 5.0; it; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4

Sarebbe stato possibile produrre in output le stesse informazioni effettuando una stampa degli indici e dei valori contenuti nell'array con una semplice chiamata della funzione print_r():

<?php
print_r(getallheaders());
?>

getallheaders() non è altro che un alias della funzione apache_request_headers() fornita da PHP per il medesimo scopo e sostanzialmente opposta alla funzione apache_response_headers(); quest'ultima viene utilizzata per produrre un array contenente tutte le informazioni relative agli headers inviati in risposta dal Web server di seguito alla richiesta operata da un client, per utilizzarla sarà possibile modificare gli esempi fatti in precedenza sostituendola alle funzioni già utilizzate.

Di seguito è possibile visualizzare gli headers prodotti in risposta ad un richiesta lanciata verso la pagina http://it2.php.net/manual/en/function.apache-response-headers.php utilizzando Google come USER AGENT:

[Cache-Control] = HTTP/1.1 200 OK
[Date] =  Wed, 10 Dec 2008 15:53:43 GMT
[Server] =  Apache/2.0.48 (Fedora)
[X-Powered-By] =  PHP/5.1.1
[Content-language] =  en
[Set-Cookie] = LAST_LANG=en; expires=Thu, 10-Dec-2009 15:53:43 GMT; path=/; domain=.php.net
[Set-Cookie] = COUNTRY=ITA%2C194.177.96.140; expires=Wed, 17-Dec-2008 15:53:43 GMT; path=/; domain=.php.net
[Last-Modified] = Wed, 10 Dec 2008 15:45:11 GMT
[Vary] = Cookie
[Connection] = close
[Content-Type] = text/html;charset=utf-8

Utilizzo della funzione header() per la modifica degli HTTP Headers

La funzione header() permette di inviare una determinata intestazione utilizzata come parametro della funzione stessa, essa consente di creare istruzioni concepite per modificare gli headers relativi ad una determinata pagina Web; un esempio classico è quello del rindirizzamento, ma questa funzione può essere impiegata per numerosi altri scopi.

Nel seguente listato, sono stati elencati alcuni possibili utilizzi della funzione header(), i commenti aiuteranno a comprenderne la finalità pratica:

# modifica dell'header relativo allo status della richiesta,
# utile nel caso in cui si debbano risolvere problematiche 
# relative alla riscrittura delle URL
# header per le richieste non soddisfatte dal server
# header prodotto dall'impossibilità di accedere alla 
# risorsa richiesta
# header prodotto per segnalare una risorsa
# spostata in modo permanente su un percorso diverso 
# da quello utilizzato per definire la richiesta
# header prodotto nel caso di malfunzionamenti del server
# in seguito al tentativo di soddisfare una richiesta
# rindirizzamento della richiesta su un percorso diverso 
# da quello specificato
# rindirizzamento della richiesta entro un periodo 
# di tempo definito (delay

header('Refresh: 5; url=http://www.miosito.it/');
echo 'Il browser verrà redirezionato entro 5 secondi';

# override del valore relativo all'header X-Powered-By
# modifica dell'header relativo al linguaggio utilizzato
# modifica dell'header relativo alla data dell'ultima modifica
# header per segnalare l'assenza di modifiche
# impostazione del Content-Length per operazioni di caching
# header per il download
# scaricamento di un  file
# disabilitazione della cache per il documento corrente
# impostazione del content type per 
# le varie tipologie di estensioni:
# richiesta di autenticazione

Funzione header() e risoluzione dei problemi di invio delle intestazioni

Si immagini ora di voler eseguire un codice simile al seguente:

<?php
# messaggio per il reindirizzamento della pagina
# intervallo prima del reindirizzamento
# url di destinazione
# reindirizzamento

L'esecuzione del codice appena proposto produrrà una notifica di errore: Warning: Cannot modify header information - headers already sent by..; si tratta di un errore dovuto al fatto che se si vuole utilizzare la funzione header() per il rindirizzamento questa non deve essere preceduta da alcun output (nessuna stringa alfanumerica, nessun tag HTML e addirittura nessuno spazio vuoto). Come evitare questo tipo di errore?

In un'applicazione da concepire da zero la soluzione è semplice, conoscendo il particolare funzionamento della funzione header() si evita di produrre output prima della sua chiamata; questa procedura può essere però di difficile utilizzo per l'aggiornamento di script preesistenti. In quest'ultimo caso è però possibile ricorrere alle cosiddette funzioni per il controllo del buffer; il semplice esempio seguente permetterà di chiarire le idee:

<?php
# controllo del buffer
# interruzione del buffer e liberazione del contenuto

In questo caso la funzione ob_start() si occupa di trattenere il flusso degli headers HTML fino al loro rilascio tramite la funzione ob_end_flush();, così l'istruzione per il rindirizzamento del percorso di destinazione potrà essere eseguita senza che venga prodotto in precedenza alcun output ed evitando la notifica di errori relativi all'impossibilità di modificare le informazioni contenute nelle intestazioni.

È però bene tenere conto che quella esposta è soltanto una soluzione tampone, per la creazione dei un'applicazione ben fatta si deve sempre tener conto del funzionamento di header() evitando di produrre output prima della sua chiamata, anche per evitare di appesantire inutilmente il listato.

Conclusioni

PHP integra numerose funzioni per la gestione degli headers HTTP che sono delle informazioni scambiate da client e server durante le operazioni di richiesta e di risposta; ogni pagina che invia un input produce degli headers così come ogni risorsa restituita dal Web server contiene delle informazioni che ne costituiscono l'intestazione.

Nel corso di questa breve trattazione sono state descritti alcuni casi pratici relativi alla visualizzazione degli headers HTTP, alla loro modifica e alla correzione di eventuali errori prodotti dalle operazioni di rindirizzamento delle pagine.

Ti consigliamo anche