ABIS Infor - 2017-01

Hoe oud is een webpagina?

Peter Vanroose (ABIS) - 16 januari 2017

Samenvatting

Wanneer we op het internet "surfen", botsen we vaak op webpagina's die duidelijk verouderd zijn. Bij andere pagina's (bij de meeste, eigenlijk) is het niet meteen duidelijk hoe up-to-date de getoonde informatie is. Soms bevat een pagina een expliciete timestamp (meestal onderaan de pagina). Maar misschien is deze info niet up-to-date!

Hoe kunnen we achterhalen wat de "echte" leeftijd is van een bepaalde webpagina? En houdt b.v. Google rekening met de leeftijd van een pagina om voorrang te geven aan bepaalde zoekresultaten?

HTML versus HTTP

Wanneer een webserver een webpagina opstuurt naar een (client) web-browser, wordt er meer teruggestuurd dan enkel de HTML van de webpagina zelf: het HTTP-protocol (of HTTPS) waarmee client en server met elkaar communiceren, stuurt namelijk in de eerste plaats een zgn. HTTP header door. De client kan dan beslissen, op basis van de informatie in die header, of hij alsnog de HTTP body (de HTML van de eigenlijke webpagina) opvraagt of niet.

Een browser toont enkel de HTTP body (de HTML dus) van een webpagina, al heeft hij eerste de header wel degelijk gezien. Als gebruiker van een gewone browser kunnen we die header-info jammer genoeg niet bekijken. Er bestaan uiteraard netwerk-tools (zoals b.v. wget) die ons deze informatie van een bepaalde webpagina kunnen tonen.

De HTTP header

De HTTP header van een HTML-webpagina kan er b.v. als volgt uit zien:

HTTP/1.1 200 OK
Date: Mon, 16 Jan 2017 14:12:38 GMT
Server: IBM_HTTP_Server
X-Powered-By: PHP/5.2.8
Expires: Mon, 16 Jan 2017 14:12:39 GMT
Cache-Control: no-cache, must-revalidate
Last-Modified: Sat, 23 Feb 2013 10:00:17 GMT
Content-Length: 4014
Content-Type: text/html

"Date" geeft gewoon aan wanneer deze info opgestuurd is; "nu", dus (ten minste als de klok van de server juist loopt).

Interessanter is het veld "Last-Modified". Deze info wordt door de webserver naar de client gestuurd, meestal op basis van de echte file-timestamp op de server.

De ouderdom van dat bestand zegt trouwens niet noodzakelijk iets over de leeftijd van de opgestuurde info: het bestand op de server kan namelijk b.v. elke dag opnieuw gegenereerd worden op basis van oude back-end informatie, of omgekeerd kan een PHP-bestand dat jaren terug gemaakt is, toch recente data genereren, b.v. uit een database.

Anderzijds kan de server deze waarde ook "verzinnen", natuurlijk. B.v. om de schijn te wekken dat een pagina geen verouderde gegevens bevat.

Ten slotte is er het veld "Expires", dat normaal gesproken jonger moet zijn dan Last-Modified. Een client (browser) hoort z'n cache van deze pagina nooit langer bij te houden dan wat het Expires-veld zegt. Dat is trouwens ook wat het veld "Cache-Control" zegt: must-revalidate. Dit is typisch voor dynamische pagina's. Bij statische pagina's (zoals b.v. CSS-bestanden, of foto's), zeker als die relatief groot zijn, is het interessanter om de client te vertellen dat de eventuele cache van de browser (lokaal opgeslagen kopie van diezelfde pagina van enige tijd terug) mag hergebruikt worden. De client (browser) merkt, na het ontvangen van de HTTP-header, dat zijn cache recenter is dan de (net ontvangen) "Last-Modified", en beslist dus om de HTTP-data niet meer op te vragen maar de cache-versie te tonen.

Dit is b.v. de header van het CSS-bestand "abisstruktuur.css" op de ABIS-website http://www.abis.be/:

HTTP/1.1 200 OK
Date: Mon, 16 Jan 2017 14:12:38 GMT
Server: Apache/2.0.52 (CentOS)
Last-Modified: Tue, 18 Oct 2016 21:38:36 GMT
Content-Length: 1814
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/css

Last-Modified suggereert dat het bestand al enkele maanden niet meer gewijzigd is. Ontbreken van Expires en Cache-Control suggereren aan de client dat hij dit bestand niet hoeft te verversen.

"Stale" webpagina's

Hoe kan een web-client (en i.h.b. een web-crawler zoals door Google gebruikt voor het voeden van hun zoekmachines) besluiten dat de informatie op een webpagina up-to-date is, of integendeel totaal verouderd?

De enige "officiële" HTTP-manier om dit te doen, is op basis van de HTTP header informatie, zoals hierboven uiteen gezet. Alle andere manieren om "leeftijd" van data te schatten, zijn ongedocumenteerd en dus vrij te implementeren.
Zo kan een web crawler (zoals Google) b.v. de inhoud van een pagina vergelijken met de inhoud van diezelfde pagina de dag voordien. Of van enkele maanden voordien. En op basis daarvan een zekere "stale-index" op de pagina plakken.

Om de stale-index van Google te omzeilen, zou men dus b.v. enkele "random" bytes in een webpagina kunnen stoppen.

Verder zou een gesofistikeerd "ad hoc" leeftijds-schattings-algoritme de inhoud van een pagina kunnen afscannen, en op basis van stijl, woordenschat, actualiteitsreferenties (b.v. verwijzingen naar pagina's die enkele maanden ervoor nog niet bestonden), ... een "educated guess" kunnen doen over de leeftijd van een bepaalde pagina.

Wedden dat Google een zéér gesofistikeerde versie van zo'n algoritme in huis heeft! Een perfecte "Big Data"-toepassing.

Besluit

Kort samengevat is er geen sluitende, gegarandeerde manier om te achterhalen hoe up-to-date de gegevens van een bepaalde webpagina zijn. De HTTP-header bevat weliswaar interessante informatie (die we niet kunnen zien vanuit een web-browser) die meestal wel accuraat is (maar niet noodzakelijk, b.v. omdat de website Google wil misleiden). Alle andere manieren om een zinvolle leeftijd te plakken op de informatie in een webpagina is het onderwerp van een "Big Data" analyse.