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): inviati dal browser nel momento in cui viene inviata un'interrogazione ad un Web server (prodotta per esempio in seguito al click su un link)
  • headers relativi alla risposta (response headers): inviati dal Web server al browser in risposta ad una determinata richiesta (per esempio sotto forma di comune pagina HTML)

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 
$headers = getallheaders();
# visualizzazione dei valori dell'array tramite ciclo
foreach ($headers as $name => $content)
{
  echo "[$name] = $content<br />n";
} 
?>

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('HTTP/1.1 200 OK');

# header per le richieste non soddisfatte dal server
header('HTTP/1.1 404 Not Found');

# header prodotto dall'impossibilità di accedere alla 
# risorsa richiesta
header('HTTP/1.1 403 Forbidden');

# header prodotto per segnalare una risorsa
# spostata in modo permanente su un percorso diverso 
# da quello utilizzato per definire la richiesta
header('HTTP/1.1 301 Moved Permanently');

# header prodotto nel caso di malfunzionamenti del server
# in seguito al tentativo di soddisfare una richiesta
header('HTTP/1.1 500 Internal Server Error');

# rindirizzamento della richiesta su un percorso diverso 
# da quello specificato
header('Location: http://www.miosito.it/');

# 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
header('X-Powered-By: PHP/5.2.8');

# modifica dell'header relativo al linguaggio utilizzato
header('Content-language: en');

# modifica dell'header relativo alla data dell'ultima modifica
$time = time() - 60;
header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT');

# header per segnalare l'assenza di modifiche
header('HTTP/1.1 304 Not Modified');

# impostazione del Content-Length per operazioni di caching
header('Content-Length: 168');

# header per il download
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="file.zip"'); 
header('Content-Transfer-Encoding: binary');

# scaricamento di un  file
readfile('file.zip');

# disabilitazione della cache per il documento corrente
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); # Date in the past
header('Pragma: no-cache');

# impostazione del content type per 
# le varie tipologie di estensioni:
header('Content-Type: text/html; charset=iso-8859-1');
header('Content-Type: text/html; charset=utf-8');
header('Content-Type: text/plain'); 
header('Content-Type: image/jpeg'); 
header('Content-Type: application/zip'); 
header('Content-Type: application/pdf'); 
header('Content-Type: audio/mpeg'); 
header('Content-Type: application/x-shockwave-flash'); 

# richiesta di autenticazione
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Accesso Riservato"');
echo 'Inserire i dati per il login';

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
echo "la pagina verrà rendirizzata tra 10 secondi";
# intervallo prima del reindirizzamento
$intervallo = 10;
# url di destinazione
$destinazione = "http://www.miosito.it";
# reindirizzamento
header('Refresh:' . $intervallo . ';' . $destinazione);
?>

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
ob_start();
$intervallo = 10;
$destinazione = "http://www.miosito.it";
echo "la pagina verrà rendirizzata tra 10 secondi";
header('Refresh:' . $intervallo . ';' . $destinazione);
# interruzione del buffer e liberazione del contenuto
ob_end_flush();
?>

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