Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Web Development

HTTP Headers per principianti

by
Difficulty:IntermediateLength:LongLanguages:

Italian (Italiano) translation by Francesco (you can also view the original English article)

Indipendentemente dal fatto che tu sia un programmatore o no, li hai visti ovunque sul web. In questo momento la barra degli indirizzi del browser mostra qualcosa che inizia con "https://". Anche il tuo primo script Hello World ha inviato intestazioni HTTP senza che te ne rendessi conto. In questo articolo ci accingiamo a conoscere i fondamenti di intestazioni HTTP e come possiamo usarli nelle nostre applicazioni web.

Che cosa sono le intestazioni HTTP?

HTTP sta per "Hypertext Transfer Protocol". L'intero World Wide Web utilizza questo protocollo. È stato creato nel primi anni del 1990. Quasi tutto quello che vedi nel browser viene trasmesso al computer su HTTP. Ad esempio, quando hai aperto questa pagina, il tuo browser probabilmente ha inviato oltre 40 richieste HTTP e ricevuto risposte HTTP per ognuna.

Le intestazioni HTTP sono la parte centrale di queste richieste e risposte HTTP e trasportano informazioni sul browser del client, la pagina richiesta, il server e altro ancora.

Esempio

Quando si digita un url nella barra degli indirizzi, il browser invia una richiesta HTTP che può assomigliare a questo:

La prima linea è la "linea di richiesta" che contiene alcune informazioni di base sulla richiesta. E il resto sono le intestazioni HTTP.

Dopo tale richiesta, il browser riceve una risposta HTTP che può apparire come la seguente:

La prima riga è lo "Status Line", seguito da una serie di intestazioni HTTP, fino ad una riga vuota. Dopo di che, il "contenuto" inizia (in questo caso, un output HTML).

Quando si guarda il codice sorgente di una pagina web nel browser, si vedrà solo la porzione HTML e non le intestazioni HTTP, anche se in realtà sono stati trasmessi insieme come visto sopra.

Queste richieste HTTP vengono anche inviate e ricevute per altre cose, ad esempio immagini, file CSS, file JavaScript ecc. Ecco perché ho detto prima che il tuo browser ha inviato almeno 40 o più HTTP richieste quando hai caricato questa pagina.

Ora, cominciamo a rivedere la struttura in modo più dettagliato.

Come visualizzare le intestazioni HTTP

Io uso le seguenti estensioni di Firefox per analizzare le intestazioni HTTP:

In PHP:

  • getallheaders() ottiene le intestazioni di richiesta. È anche possibile utilizzare l'array $_SERVER.
  • headers_list() ottiene le intestazioni di risposta.

Più avanti in questo articolo, vedremo alcuni esempi di codice in PHP.

Struttura di richiesta HTTP

La prima riga della richiesta HTTP è chiamata la linea di richiesta e si compone di 3 parti:

  • Il "metodo" indica il tipo di richiesta. I metodi più comuni sono GET, POST e HEAD.
  • Il "path" è generalmente la parte dell'url che viene dopo l'host (dominio). Ad esempio, quando si richiede "https://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/" , la path è "/ tutorial/altri/top-20-mysql-best practice /".
  • La parte "protocollo" contiene "HTTP" e la versione, che di solito è 1.1 browser moderni.

Il resto della richiesta contiene le intestazioni HTTP come coppie "Nome: valore" su ogni riga. Questi contengono varie informazioni sulla richiesta HTTP e il vostro browser. Ad esempio, la riga "User-Agent" fornisce informazioni sulla versione del browser e il sistema operativo che si utilizza. "Accept-Encoding" indica al server se il vostro browser può accettare output compresso come gzip.

Avrete notato che i dati del cookie sono trasmessi anche all'interno di un'intestazione HTTP. E se ci fosse un referring url, ci sarebbe stato anche nell'intestazione.

La maggior parte di queste intestazioni sono facoltative. Questa richiesta HTTP avrebbe potuto essere piccola come questa:

E si otterrebbe comunque una risposta valida dal server web.

Metodi di richiesta

I tre metodi di richiesta più comunemente usati sono: GET, POST e HEAD. Hai probabilmente già familiarità con i primi due, dalla scrittura di form html.

GET: Recuperare un documento

Questo è il metodo principale utilizzato per il recupero di html, immagini, JavaScript, CSS, ecc. La maggior parte dei dati che viene caricato nel browser è stato richiesto utilizzando questo metodo.

Ad esempio, quando si carica un articolo Nettuts+, la prima linea di richiesta HTTP appare come segue:

Una volta caricato l'html, il browser inizierà l'invio di richieste GET per le immagini, che può apparire come segue:

I forms possono essere impostati per utilizzare il metodo GET. Ecco un esempio.

Quando tale modulo viene inviato, la richiesta HTTP inizia come questa:

Si può vedere che ogni input del form è stato aggiunto nella stringa di query.

POST: Invia dati al Server

Anche se è possibile inviare dati al server utilizzando GET e la stringa di query, in molti casi POST sarà preferibile. L'invio di grandi quantità di dati utilizzando GET non è pratico e ha dei limiti.

Vengono inviate più comunemente le richieste POST dai form. Cambiamo il precedente esempio con un metodo POST.

Supponiamo che il form crei una richiesta HTTP come questa:

Ci sono tre cose importanti da notare qui:

  • Il path nella prima riga è semplicemente /foo.php e non c'è più nessuna stringa di query.
  • Sono state aggiunte le intestazioni Content-Type e Content-Length, che forniscono informazioni sui dati inviati.
  • Tutti i dati sono ora inviati dopo le intestazioni, con lo stesso formato della stringa di query.

Le richieste con metodo POST possono avvenire anche tramite AJAX, applicazioni, cURL, ecc. E tutti i form di upload di file sono obbligati ad usare il metodo POST.

HEAD: Recuperare informazioni di intestazione

HEAD è identico a GET, tranne per il fatto che il server non restituisce il contenuto nella risposta HTTP. Quando si invia una richiesta HEAD, vuol dire che ti interessa solo il codice di risposta e le intestazioni HTTP, non il documento stesso.

"Quando si invia una richiesta HEAD, vuol dire che ti interessa solo il codice di risposta e le intestazioni HTTP, non il documento stesso."

Con questo metodo il browser può controllare se un documento è stato modificato, per scopi di memorizzazione nella cache. Si può anche verificare se il documento esista o meno.

Ad esempio, se hai un sacco di link sul tuo sito Web, è possibile inviare periodicamente richieste HEAD a tutti per controllare i collegamenti interrotti. Questo sarà molto più veloce rispetto all'utilizzo di GET.

Struttura di risposta HTTP

Dopo che il browser invia la richiesta HTTP, il server risponde con una risposta HTTP. Escludendo il contenuto, assomiglierà a questo:

La prima parte di dati è il protocollo. Questo è ancora di solito HTTP/1.x o HTTP/1.1 su server moderni.

La parte successiva è il codice di stato, seguito da un breve messaggio. Codice 200 significa che la nostra richiesta GET è stata completata e il server restituirà il contenuto del documento richiesto, subito dopo le intestazioni.

Tutti abbiamo visto le pagine "404". Questo numero viene effettivamente dalla parte di codice di stato della risposta HTTP. Se la richiesta GET sia fatto per un percorso che il server non riesce a trovare, risponderebbe con un 404 invece di 200.

Il resto della risposta contiene intestazioni proprio come la richiesta HTTP. Questi valori possono contenere informazioni sul server, quando il file/pagina è stato modificato, il tipo di mime ecc...

Ancora una volta, la maggior parte di tali intestazioni sono in realtà facoltative.

Codici di stato HTTP

  • I 200 sono utilizzati per le richieste.
  • I 300 sono per le redirezioni.
  • I 400 sono utilizzati se c'è un problema con la richiesta.
  • I 500 vengono utilizzati se c'è un problema con il server.

200 OK

Come accennato prima, questo codice di stato viene inviato in risposta ad una richiesta in caso di successo.

206 Contenuto parziale

Se un'applicazione richiede solo un pezzo del file richiesto, viene restituito il codice 206.

E' più comunemente usato con gestori di download che possono interrompere e riprendere un download o dividere il download in parti.

404 non trovato

Quando il file o la pagina richiesta non è stato trovato, viene inviato un codice di 404 risposta dal server.

401 Unauthorized

Pagine web protette da password inviano questo codice. Se non si immette un account di accesso valido, vedrai il seguente codice nel browser.

Si noti che questo si applica solo alle pagine protette da password HTTP, che rispondono alle richieste di accesso come in questo esempio:

403 Forbidden

Se non sei autorizzato ad accedere a una pagina, questo codice può essere inviato al vostro browser. Questo accade spesso quando si tenta di aprire un url per una cartella, che non contiene nessuna pagina di indice. Se le impostazioni del server non consentono la visualizzazione del contenuto della cartella, si otterrà un errore 403.

Ad esempio, sul mio server locale, ho creato una cartella di immagini. All'interno di questa cartella ho messo un file. htaccess con questa riga: "Options - Indexes". Ora quando cerco di aprire http://localhost/images/ - vedo questo:

Ci sono altri modi in cui l'accesso può essere bloccato, e codici 403 possono essere inviati. Ad esempio, è possibile bloccare un indirizzo IP con l'aiuto di alcune direttive di htaccess.

302 (or 307) Moved Temporarily & 301 Moved Permanently

Questi due codici sono utilizzati per il reindirizzamento di un browser. Ad esempio, quando si utilizza un servizio di accorciamento url come bit.ly, questo è esattamente il modo in cui reindirizzano le persone che fanno clic sui relativi collegamenti.

Sia 302 e 301 sono gestiti molto similmente dal browser, ma possono avere significati diversi per gli spider dei motori di ricerca. Per esempio, se il vostro sito è giù per manutenzione, è possibile reindirizzare a un'altra posizione utilizzando 302. Lo spider del motore continuerà a controllare la vostra pagina in futuro. Ma se si reindirizza utilizzando 301, questo indicherà allo spider che il tuo sito Web è stato spostato definitivamente a quell'indirizzo. Per darvi un'idea migliore: http://www.nettuts.com reindirizza a https://net.tutsplus.com/ utilizzando un codice 301 invece di 302.

500 Internal Server Error

Questo codice si vede solitamente quando uno script web si blocca. molti script CGI non trasmettono errori direttamente al browser, a differenza di PHP. In caso di eventuali errori irreversibili, semplicemente inviano un codice di stato 500. E il programmatore deve quindi cercare il log degli errori nel server per trovare i messaggi di errore.

Elenco completo

Puoi vedere la lista completa dei codici di stato HTTP con le relative spiegazioni qui.

Intestazioni HTTP nelle richieste HTTP

Ora, esamineremo alcune delle intestazioni HTTP più comuni trovate nelle richieste HTTP.

Quasi tutte queste intestazioni possono essere trovate nell'array $_SERVER in PHP. È anche possibile utilizzare la funzione getallheaders() per recuperare tutte le intestazioni alla volta.

Host

Una richiesta HTTP viene inviata a un indirizzo IP specifico. Ma poiché la maggior parte dei server sono in grado di ospitare più siti Web sotto lo stesso IP, devono sapere quale nome di dominio sta cercando il browser.

Questo è fondamentalmente il nome host, tra cui il dominio e il sottodominio.

In PHP, si può trovare come $_SERVER['HTTP_HOST'] o $_SERVER['SERVER_NAME'].

User-Agent

Questa intestazione può trasmettere diversi tipi di informazioni quali:

  • Nome del browser e versione.
  • Nome del sistema operativo e versione.
  • Lingua predefinita.

In questo modo i siti web possono raccogliere determinate informazioni di carattere generale sui sistemi dei loro navigatori. Ad esempio, sono in grado di rilevare se il navigatore sta utilizzando un browser del cellulare e li reindirizza a una versione mobile del loro sito web che funziona meglio con basse risoluzioni.

In PHP, si può trovare con: $_SERVER['HTTP_USER_AGENT'].

Accept-Language

Questa intestazione visualizza l'impostazione della lingua predefinita dell'utente. Se un sito ha versioni in lingue diverse, può reindirizzare un utente in base a questi dati.

Può indicare più lingue, separate da virgole. La prima è la lingua preferita, e ogni altra lingua elencata può indicare un valore "q", che è una stima della preferenza dell'utente per la lingua (min. 0 max. 1).

In PHP, si può trovare come: $_SERVER["HTTP_ACCEPT_LANGUAGE"].

Accept-Encoding

I browser più moderni supportano gzip e questo sarà inviato nell'intestazione. Il server web può quindi inviare l'output HTML in un formato compresso. Questo può ridurre la dimensione fino all'80% per risparmiare tempo e larghezza di banda.

In PHP, si può trovare con: $_SERVER["HTTP_ACCEPT_ENCODING"]. Tuttavia, quando si utilizza la funzione di callback ob_gzhandler(), controllerà questo valore automaticamente, quindi non è necessario.

If-Modified-Since

Se un documento web è già memorizzato nella cache nel tuo browser, e si visita ancora una volta, il browser può verificare se il documento è stato aggiornato mediante l'invio di questo:

Se non è stato modificato successivamente a tale data, il server invierà un codice di risposta "304 non modificato" e nessun contenuto - e il browser caricherà il contenuto dalla cache.

In PHP, si può trovare con: $_SERVER ['HTTP_IF_MODIFIED_SINCE'].

C'è anche un'intestazione HTTP denominata Etag, che può essere utilizzato per assicurarsi che la cache è corrente. Ne parleremo presto.

Cookie

Come suggerisce il nome, questo invia i cookie memorizzati nel tuo browser per quel dominio.

Si tratta di coppie nome=valore separate da punti e virgola. I cookie possono anche contenere l'id di sessione.

In PHP, singoli cookie sono accessibili con $_COOKIE. È possibile accedere direttamente alle variabili di sessione utilizzando $_SESSION, e se avete bisogno dell'id di sessione, è possibile utilizzare la funzione session_id() anziché i cookie.

Referer

Come suggerisce il nome, questa intestazione HTTP contiene l'url di riferimento.

Ad esempio, se visita la homepage di Nettuts+ e si clicca su un collegamento di un articolo, questa intestazione viene inviata al browser:

In PHP, può essere trovato con $_SERVER['HTTP_REFERER'].

Avrete notato che la parola "referrer" è scritta in modo errato come "referer". Purtroppo è stato inserito nelle specifiche HTTP ed è rimasto invariato.

Authorization

Quando una pagina web richiede autorizzazione, il browser apre una finestra di login. Quando si immette un nome utente e una password in questa finestra, il browser invia un'altra richiesta HTTP, ma questa volta contiene questa intestazione.

I dati all'interno dell'intestazione sono codificati in base64. Ad esempio, base64_decode('bXl1c2VyOm15cGFzcw==') restituisce 'myuser:mypass'

In PHP, questi valori possono essere trovati come $_SERVER['PHP_AUTH_USER'] e $_SERVER['PHP_AUTH_PW'].

Maggiori informazioni su questo quando parleremo dell'intestazione WWW-Authenticate.

Intestazioni HTTP in risposte HTTP

Ora ci accingiamo a guardare alcune delle intestazioni HTTP più comuni trovate nelle risposte HTTP.

In PHP, è possibile impostare le intestazioni di risposta utilizzando la funzione header(). PHP invia già determinate intestazioni automaticamente, per caricare il contenuto e l'impostazione cookie ecc... È possibile visualizzare le intestazioni che vengono inviate, o verranno inviate, con la funzione di headers_list(). È possibile controllare se le intestazioni sono state inviate già, con la funzione di headers_sent().

Cache-Control

Definizione da w3.org: "l'intestazione Cache-Control viene utilizzata per specificare le direttive che devono essere osservate da tutti i meccanismi di memorizzazione nella cache lungo la catena richiesta/risposta." Questi "meccanismi di caching" includono gateway e proxy che potrebbe utilizzare il tuo ISP.

Esempio:

"public" significa che la risposta può essere memorizzata nella cache da parte di chiunque. "max-age" indica per quanti secondi la cache è valida. Permettere che il tuo sito venga memorizzato nella cache può ridurre il carico del server e la larghezza di banda e inoltre migliorare i tempi di caricamento nel browser.

La memorizzazione nella cache può anche essere prevenuta mediante la direttiva di "no-cache".

Per informazioni più dettagliate, Vedi w3.org.

Content-Type

Questa intestazione indica il "mime-type" del documento. Il browser quindi decide come interpretare il contenuto in base a questo. Ad esempio, una pagina html (o uno script PHP con output html) può restituire questo:

"testo" è il tipo e "html" è il sottotipo del documento. L'intestazione può contenere anche altre informazioni come il charset.

Per un'immagine gif, questo può essere inviato.

Il browser può decidere di utilizzare un' applicazione esterna o estensione esterna basata sul mime-type. Ad esempio questo causerà il caricamento di Adobe Reader:

Solitamente Apache è in grado di rilevare il tipo mime di un documento e il inviare l'intestazione appropriata. La maggior parte dei browser hanno anche alcune funzioni per il rilevamento automatico dei tipi mime, nel caso in cui le intestazioni sono sbagliate o non presenti.

Si può trovare un elenco di tipi mime comuni qui.

In PHP, è possibile utilizzare la funzione finfo_file() per rilevare il tipo di mime di un file.

Content-Disposition

Questa intestazione indica al browser di aprire una casella di download di file, invece di cercare di analizzare il contenuto. Esempio:

Che farà sì che il browser mostri:

Si noti che l'intestazione Content-Type appropriata deve essere inviata insieme a questo:

Content-Length

Quando il contenuto sta per essere trasmesso al browser, il server può indicare la dimensione di esso (in byte) utilizzando questa intestazione.

Ciò è particolarmente utile per i download di file. Che è come il browser può determinare lo stato di avanzamento del download.

Ad esempio, ecco uno script che ho scritto, che simula un download lento.

Il risultato è:

Ora commentiamo l'intestazione Content-Length

Il risultato è:

Il browser può solo dirti quanti byte sono stati scaricati, ma non conosce l'importo totale. E nella barra di avanzamento non viene visualizzato lo stato di avanzamento.

ETag

Si tratta di un'altra intestazione che viene utilizzata per scopi di memorizzazione nella cache. Assomiglia a questo:

Il server web può inviare questa intestazione con ogni documento che gestisce. Il valore può essere basato sull'ultima data di modifica, dimensione del file o anche il valore di checksum di un file. Il browser salva quindi questo valore quando memorizza nella cache il documento. La prossima volta che il browser richiede lo stesso file, invia questo nella richiesta HTTP:

Se il valore di Etag del documento corrisponde a quello, il server invierà un codice 304 invece di 200 e nessun contenuto. Il browser caricherà il contenuto dalla cache.

Last-Modified

Come suggerisce il nome, questa intestazione indica la data dell'ultima modifica del documento, in formato GMT:

Offre un altro modo per il browser di memorizzare nella cache un documento. Il browser può inviare questo nella richiesta HTTP:

Abbiamo già parlato di questo prima nella sezione "If-Modified-Since".

Location

Questa intestazione viene usata per le redirezioni. Se il codice di risposta è 301 o 302, il server deve inviare anche questa intestazione. Ad esempio, quando si va a http://www.nettuts.com il browser riceverà questo:

In PHP, è possibile reindirizzare un utente in questo modo:

Per impostazione predefinita, invierà un codice di 302 risposta. Se si desidera inviare 301 invece:

Set-Cookie

Quando un sito web vuole impostare o aggiornare un cookie nel tuo browser, utilizzerà questa intestazione.

Ogni cookie è inviato come intestazione separata. Si noti che i cookie impostati tramite JavaScript non passano attraverso le intestazioni HTTP.

In PHP, è possibile impostare i cookie utilizzando la funzione setcookie() e PHP invia le intestazioni HTTP appropriate.

Che provoca l'invio di questa intestazione:

Se non è specificata la data di scadenza, il cookie viene eliminato quando viene chiusa la finestra del browser.

WWW-Authenticate

Un sito web può inviare questa intestazione per autenticare un utente tramite HTTP. Quando il browser vede questa intestazione, aprirà una finestra di dialogo di login.

Che assomiglia a questa:

C'è una sezione nel manuale di PHP, che ha esempi di codice su come effettuare questa operazione in PHP.

Content-Encoding

Questa intestazione viene generalmente impostata quando il contenuto restituito è compresso.

In PHP, se si utilizza la funzione di callback di ob_gzhandler(), verrà impostato automaticamente per voi.

Conclusione

Grazie per la lettura. Spero che questo articolo sia un buon punto di partenza per conoscere le intestazioni HTTP. Si prega di lasciare commenti e domande qui sotto, cercherò di rispondere il piu possibile.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.