Le richieste HEAD e PHP

Lunedì 12 Febbraio 2007 - 09:38

di Gabriele Farina

PHP e Open Source

Stavo aggiornando ieri i sorgenti del framework che ho intenzione di illustrare nella serie di articoli che ho iniziato questa settimana in modo da aggiungere delle funzionalità base per il caching delle risposte, quando mi sono imbattuto nella gestione delle richieste HEAD (che successivamente ho deciso di tralasciare per non complicare il già complicato - da trattare in degli articoli - codice del framework).

Normalmente PHP gestisce le richieste HTTP HEAD come farebbe per qualunque altra richiesta, eseguendo l’intero script puntato da quest’ultima. Come ben sapete però HEAD è un tipo di richiesta che non si aspetta contenuto e viene utilizzata dai browser e da altri sistemi per controllare alcune informazioni di stato, tra cui quello della cache.

Se non gestita bene quindi, una sola - apparentemente - richiesta di un URL da parte di un programma, potrebbe eseguire due volte il nostro codice andando ad inquinare alcuni risultati sensibili come ad esempio il conteggio degli accessi. Oltretutto, generando dell’output, la richiesta HEAD potrebbe non essere interpretata correttamente - o non essere interpretata del tutto.

Gli sviluppatori di PHP ovviamente non gestiscono in modo particolare le richieste HEAD dato che tramite la funzione header (che potrebbe trovarsi in qualunque punto di uno script) è possibile assegnare condizionalmente degli header.

Voi gestite i casi particolari per le richieste HEAD ? Che approccio seguite ?

Tags:

Categoria: PHP e Open Source | Permalink

Commenti

1

La funzione “header” non si può trovare in qualsiasi punto di uno script. Si deve mettere prima di qualsiasi output.

# - postato da Mattia - 12 Febbraio 2007 - 12:25

2

A Mattia:

c’è una soluzione per poterla inserire dove si vuole: un output buffer.
Io gestisco gli header tramite php cercando comunque di limitarne l’uso.

# - postato da Paolo Pizzolongo - 12 Febbraio 2007 - 12:39

3

il concetto di output buffer è banale però il nome è fighissimo..:D

# - postato da lloyd27 - 12 Febbraio 2007 - 14:07

4

Conosco quella soluzione, volevo solo precisare una frase che è stata scritta nell’articolo.

# - postato da Mattia - 12 Febbraio 2007 - 17:47

5

E oserei aggiungere che se non è proprio necessario l’output buffer rende disordinato il codice…
Se una funzione è fatta per impostare l’header della pagina (che viene prima del contenuto) mi sembra giusto metterla all’inizio del codice (tipo carachter encoding, tipo di output ecc).

Ciao

# - postato da Giovanni Battista Lenoci - 13 Febbraio 2007 - 09:42

6

Scusami Giovanni Battista Lenoci ma ti tagli le gambe da solo se metti header sempre e solo all’inizio del codice … non ti capita mai di parsare le richieste, connetterti ad un database, selezionare il tipo di output in base a determinati parametri … e usare i giusti headers, anche senza output buffer, solo alla fine del tuo codice ?

… a meno che tu non stessi parlando di header sempre prima dell’ output … e non del codice ;)

Riguardo il post, presumo che Gabriele parlasse di tutto tranne che di “ob_start” … piuttosto della $_SERVER e delle informazioni inviate da parte del client, non quelle da inviare allo stesso (come fa header), dico male ?

Per quel che mi riguarda, salvo rari casi particolari, non mi sono mai preoccupato del doppio click involontario su un link, sia perchè ultimamente sto basando i reports su Google Analytics, che essendo già parte dell’output dovrebbe soffrire meno di queste problematiche, sia perchè se è fondamentale controllare che una pagina non sia clickata più di una volta presumo ci siano vari metodi per evitare che questo accada … ma non me ne viene in mente uno anche perchè come fai a stabilire se l’utente, mentre sta scaricando la pagina, farà un altro click ?
Considera che alcuni browsers ti mostrano la pagina solo una volta caricata, non ti danno schermata bianca appena clicki, proprio perchè prima verificano il link, attendono uno stato 200 o 304 che sia ed a quel punto mostrano il contenuto, ma se non erro a quel punto gli headers della pagina (o del webserver) sono già stati inviati, o no ?

# - postato da andr3a - 13 Febbraio 2007 - 12:36

7

@andrea

Hai azzeccato il punto del discorso … comunque, per quanto riguarda la tua domanda finale non so risponderti con certezza. Penso che gli header siano già stati ricevuti quando inizia il rendering della seconda pagina, ma è anche abbastanza possible che si affidino a richieste HEAD per controllare lo stato del documento che dovranno caricare.

# - postato da Gabriele Farina - 13 Febbraio 2007 - 12:52

8

io credo che il “super head”, ovvero lo stato del documento, sia inviato dal webserver e non è quindi controllabile dal php che è un embed, non una routine.

Non so se con Python, con il quale ci hanno fatto più di un vero e proprio webserver, o con altri linguaggi (tomcat viaggia “sopra o sotto” apache ?) sia possibile gestire anche quel livello di interazione … di sicuro se con php riesci ad arrivare alle informazioni, queste probabilmente saranno già state inviate (pensa ad un mod_rewrite che reindirizza, non puoi gestire un link sbagliato, lo fa il webserver, prima dell’embed)

Spero di essermi spiegato, pur non avendo dato alcuna risposta.

# - postato da andr3a - 13 Febbraio 2007 - 15:05

9

io credo che il “super head”, ovvero lo stato del documento, sia inviato dal webserver e non è quindi controllabile dal php che è un embed, non una routine.

uhm … ho detto cavolata, nel senso che puoi anche inviare uno stato del documento diverso dal 200 … non so se in quel caso sia una sovrascrittura piuttosto che un vero e proprio singolo header di stato … forse, pensandoci meglio, mod_rewrite a parte, c’è modo di gestire le richieste, ma non essendoci una funzione ufficiale per sapere cosa stia facendo/aspettando il client, non so come si possa gestire … uhm, apri un post sul forum ? :D

# - postato da andr3a - 13 Febbraio 2007 - 15:13

10

uhm, apri un post sul forum ? :D

Lascio a te il compito ;)
Poi fammi sapere

# - postato da Gabriele Farina - 13 Febbraio 2007 - 18:54

Inserisci il tuo commento:





(puoi usare i seguenti tag HTML per formattare il testo -
a href, b, i, br/, p, strong, em, ul, ol, li, blockquote, pre):

 

Anteprima del commento