Softwareentwicklung und Managed Hosting
ANEXIA
OKT
31
2014

Die Geschichte von lighttpd und dem Last-Modified-Header

Geschrieben am  31. Oktober 2014 von Stephan Peijnik

Während ich gestern unseren neuen öffentlichen Debian Mirror (http://debian.anexia.at/) einigen Tests unterzog, bemerkte ich, dass mein System die Packages.gz Dateien jedes mal neu downloadete, sobald ich ein apt-get update machte.

Das war nicht, was ich erwartet hatte und mein erster Verdacht, dass ein Konfigurationsfehler unsererseits die Ursache dieses Verhaltens war, würde sich bestätigen.

Wie schon der Titel dieses Eintrags verrät, war der Grund, warum apt-get die Package-Liste jedes Mal neu gedownloadet hat, ein fehlender Last-Modified Header auf Serverseite.

Nachdem ich eine ganze Weile versucht hatte zu debuggen, ohne wirklich etwas zu finden, öffnete ich den lighttpd Quellcode (mit apt-get source lighttpd – welches mir Version 1.4.31-4 brachte) und begann zu suchen.

Nach fünf Minuten stieß ich auf ein interessantes Stück Code in mod_staticfile.c von lighttpd 1.4.31, Zeile 449.

Ohne nun den Code selbst anzuführen ist die Kurzversion dessen, was ich dort vorgefunden habe, folgendes: wenn der Content-Type NULL ist, dann setze den Content-Type auf „application/octet-stream“ und deaktiviere Caching.

In diesem Fall führt die Deaktivierung von Caching dazu, dass sowohl ETag, als auch Last-Modified weder berechnet, noch mit der HTTP Response gesendet werden.

Aber wie lässt sich das beheben? Es gibt einige Ansätze, da lighttpd unter Debian die Datei /etc/mime.types auswertet. Eine Lösung die für absolut jede Datei funktioniert ist, einen Fall-Back-Wert in der Konfigurationsdatei zu definieren.

Warum? Weil dann der Content-Type nicht NULL ist, wenn er abgefragt wird.

tl;dr:

Langer Rede kurzer Sinn, die Lösung des Problems war, diese drei Zeilen am Ende unserer lighttpd.conf anzufügen:

mimetype.assign += (

„“ => „application/octet-stream“

)