Gli HTTP header usati da Google: If-None-Match e If-Modified-Since

Google usa gli header HTTP If-None-Match e If-Modified-Since per verificare se un file fisico è stato modificato dopo l'ultima acquisizione.
immagine dell'autore dell'articolo

Scritto da: Alberto

Una vita nell'informatica, per lavoro e per passione.
agsdix-far fa-calendar-alt
Data pubblicazione: 4 Giugno 2025
agsdix-far fa-comments

Quando i robot di Google vanno a leggere una pagina già conosciuta per rilevare eventuali aggiornamenti, usano uno stratagemma per evitare di scaricare file fisici (immagini, fogli di stile, script e così via) che non sono variati dopo l’ultima acquisizione.

Il metodo usato dal crawler di Google

Nella documentazione Panoramica dei crawler e dei fetcher di Google, viene descritto l’uso fatto a questo scopo di due coppie di HTTP header:

  • (response) ETag > (request) If-None-Match
  • (response) Last-Modified > (request) If-Modified-Since.

Quando scarica un file per la prima volta, il crawler di Google conserva due HTTP Response Header del file: ETag (Entity Tag) e Last-Modified. Il primo header fornisce un codice univoco generato a partire dal file (come un’impronta hash); il secondo è la data di ultima modifica del file espressa nel formato standard http sulla data/ora (ad esempio: Wed, 01 Jun 2023 08:00:00 GMT).

La volta successiva che il crawler richiede il file, invia l’HTTP Request Header If-None-Match con l’ETag ricevuto la volta precedente come parametro. Il server confronta l’ETag della richiesta con l’ETag attuale del file richiesto: se i due valori coincidono, invece che restituire il file (operazione inutile, in quanto identico a quello già inviato la volta precedente), invia in risposta uno stato HTTP 304 - Not Modified; in caso contrario restituisce il nuovo file, con uno stato HTTP 200.

In alternativa a questo metodo, il crawler Google anziché inviare l’header If-None-Match, può inviare l’header If-Modified-Since con il valore Last-Modified ricevuto la volta precedente. Analogamente al caso precedente, il server confronta la data presente nella richiesta con quella di ultima modifica del file richiesto: se i due valori coincidono, invece che restituire il file, invia in risposta uno stato HTTP 304 - Not Modified; in caso contrario restituisce il nuovo file, con uno stato HTTP 200.

Tutto ciò però funziona solo se il web server:

  • invia in output gli HTTP Header ETag e Last-Modified (entrambi o almeno uno dei due)
  • interpreta correttamente gli Header in input If-None-Match e If-Modified-Since (entrambi o almeno uno dei due)

Per sapere se il tuo web server svolge queste attività puoi chiedere al supporto tecnico, oppure puoi applicare il procedimento descritto di seguito.

Scegliere un file per la prova e verificare i Response Header

Per effettuare la prova è necessario un file fisico (una pagina html dinamica, come quelle generata dai CMS, non otterrà gli Header che ci servono), io ho scelto il file javascript:
https://serviziweb.padova.it/wp-content/themes/divi%20child/assets/js/nonfloatingfooter.js (figura 1). Per verificare il comportamento del tuo web server dovrai usare un file presente sul tuo sito.

screenshot della finestra Chrome
Fig.1 – lo script usato per il test
  • Aprire il link precedente con il browser Chrome, in modo a visualizzare il codice javascript;
  • aprire la pagina degli Strumenti degli sviluppatori del browser (di seguito solo “Strumenti”) utilizzando il percorso Menu principale (i tre pallini in alto a destra) > Altri Strumenti > Strumenti per gli sviluppatori (la scorciatoia da tastiera F12 ottiene lo stesso risultato);
  • selezionare la voce di menu Rete (nella finestra degli Strumenti);
  • posizionarsi sulla finestra di Chrome e premere i tasti CTRL + F5 per ricaricare la pagina e tornare poi nella finestra degli Strumenti;
  • verificare che il file non sia stato preso dalla cache del browser: se la dimensione del file presenta un valore numerico, allora è stato scaricato dal server, in caso contrario nella colonna Dimensione compare la scritta (memoria cache), vedi Figura 2 (clicca sull’immagine per ingrandirla).
  • cliccare sul nome del file per vedere le intestazioni HTTP e verificare che siano presenti gli header Etag e Last-Modified. Come si può vedere in figura 3. il server ha superato la prima parte della prova (cliccare sull’immagine per ingrandirla).

Generare un Header HTTP If-None-Match

Si deve ora simulare il crawler Google e verificare che il web server gestisca gli HTTP header in ingresso.

  • scaricare l’estensione del browser Chrome ModHeader, che permette di modificare le intestazioni HTTP delle richieste inviate da Chrome;
  • impostare l’header If-None-Match con lo stesso valore dell’ETag appena ricevuto dal web server (le doppie virgolette sono obbligatorie, il prefisso “W/” è facoltativo, se viene messo, però, dev’essere in maiuscolo);
screenshot della finestra Chrome
Fig.4 – Modheader – header HTTP if-none-match
  • aggiornare la pagina Chrome con i tasti CTRL+F5;
  • controllare sulla pagina Strumenti che il web server restituisca uno stato HTTP 304, come in figura 5. (cliccare sull’immagine per ingrandirla)

Generare un Header HTTP If-Modified-Since

  • impostare l’header If-Modified-Since con lo stesso valore dell’header Laat-Modified appena ricevuto dal web server (Per ottenere lo stato 304 non basta che la data impostata in If-Modified-Since sia successiva a Last-Modified; deve corrispondere esattamente alla data di ultima modifica; rispettare il formato della data, come nell’esempio di figura 6.);
screenshot della finestra Chrome
Fig.6 – Modheader – header HTTP if-modified-since
  • aggiornare la pagina Chrome con i tasti CTRL+F5;
  • controllare sulla pagina Strumenti che il web server restituisca uno stato HTTP 304, come in figura 7. (cliccare sull’immagine per ingrandirla)

Risorse online

  • il sito http.dev fornisce un elenco completo e dettagliato degli header HTTP.

0 commenti