www.fabiankeil.de/blog-surrogat/2006/05/05/cache-probleme-mit-privoxy-fehlermeldungen-beseitigt.html

Cache-Probleme mit Privoxy-Fehlermeldungen beseitigt

Seit dem Beseitigen der Privoxy-DNS-Probleme treten Privoxy-Fehlermeldungen deutlich seltener auf, aber immer noch öfter als nie.

Wenn der Browser die Fehlermeldungen zwischenspeichert, führt das weiterhin zu den beschriebenen Nervereien: der Browser setzt beim nächsten Versuch den If-Modified-Since-Header, der Server sendet einen 304er und der Browser zeigt die veraltete Fehlermeldung erneut an.

Problem

Privoxy setzt zwar Cache-Control auf no-cache, die Bedeutung dieses Headers entspricht jedoch nicht ganz dem Wortlaut:

no-cache
If the no-cache directive does not specify a field-name, then a cache MUST NOT use the response to satisfy a subsequent request without successful revalidation with the origin server.

Solange der Browser vor der nächsten Benutzung des gespeicherten Dokuments nochmal beim Server anfragt, darf er das Dokument zwischenspeichern.

Zusätzlich datiert Privoxy den Expires-Header in die Vergangenheit, für Expires-Header, deren Wert vor dem des Date-Headers liegt, gilt aber das gleiche wie für Cache-Control: no-cache:

Many HTTP/1.0 cache implementations will treat an Expires value that is less than or equal to the response Date value as being equivalent to the Cache-Control response directive "no-cache".

Ich habe keine Stelle gefunden, die dieses Verhalten für HTTP/1.1 verbieten würde.

Lösung

Auch wenn sich das Zwischenspeichern der Fehlermeldungen nicht verhindern lässt, kann man es immer noch unwirksam machen und den Last-Modified-Header auf ein Datum setzen, das vor dem Änderungsdatum eines jeden Dokuments im Web liegt. Zum Beispiel auf den Geburtstag von Tim Berners-Lee.

Nutzt der Browser das Datum später für den If-Modified-Since-Header, wird er sicher keinen 304 bekommen. Der Header muss den Server nicht mal erreichen, er kann vorher von Privoxy entfernt werden.

Der Privoxy-Sammelpatch setzt die Idee um, weitere Auswirkungen des Patches sind zusammen mit Hinweisen zur Installation auf der Seite Minor Privoxy improvements aufgeführt.

Demo

Simulierter Fehler

Um die Fehlermeldung zu provozieren wurde Tor beendet, Privoxy verlor die Verbindung zum Netz und konnte die von Firefox angeforderte Seite nicht liefern. Aus der Sicht von Firefox:

http://blog.fefe.de/

GET / HTTP/1.1
Host: blog.fefe.de
User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.0.2) Gecko/20060414 Firefox/1.5.0.2
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en,de-ch;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 600
Proxy-Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

HTTP/1.x 503 Connect failed
Content-Length: 4086
Content-Type: text/html
Cache-Control: no-cache
Date: Fri, 05 May 2006 13:44:16 GMT
Last-Modified: Wed, 08 Jun 1955 12:00:00 GMT
Expires: Sat, 17 Jun 2000 12:00:00 GMT

Aus der Sicht von Privoxy:

May 05 15:44:16 Privoxy(08085000) Connect: OK
May 05 15:44:16 Privoxy(08085000) Connect: accept connection ... 
May 05 15:44:16 Privoxy(0810d800) Header: New HTTP Request-Line: GET / HTTP/1.1
May 05 15:44:16 Privoxy(0810d800) Header: scan: GET / HTTP/1.1
May 05 15:44:16 Privoxy(0810d800) Header: scan: Host: blog.fefe.de
May 05 15:44:16 Privoxy(0810d800) Header: scan: User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.0.2) Gecko/20060414 Firefox/1.5.0.2
May 05 15:44:16 Privoxy(0810d800) Header: scan: Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
May 05 15:44:16 Privoxy(0810d800) Header: scan: Accept-Language: en,de-ch;q=0.5
May 05 15:44:16 Privoxy(0810d800) Header: scan: Accept-Encoding: gzip,deflate
May 05 15:44:16 Privoxy(0810d800) Header: scan: Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
May 05 15:44:16 Privoxy(0810d800) Header: scan: Keep-Alive: 600
May 05 15:44:16 Privoxy(0810d800) Header: scan: Proxy-Connection: keep-alive
May 05 15:44:16 Privoxy(0810d800) Header: scan: Pragma: no-cache
May 05 15:44:16 Privoxy(0810d800) Header: scan: Cache-Control: no-cache
May 05 15:44:16 Privoxy(0810d800) Header: Modified: User-Agent: Mozilla/5.0 (X11; U; FreeBSD sparc64; en-AU; rv:1.8.0.2) Gecko/20060428 Firefox/1.5.0.2
May 05 15:44:16 Privoxy(0810d800) Header: Suppressed offer to compress content
May 05 15:44:16 Privoxy(0810d800) Header: crumble crunched: Keep-Alive: 600!
May 05 15:44:16 Privoxy(0810d800) Header: crumble crunched: Proxy-Connection: keep-alive!
May 05 15:44:16 Privoxy(0810d800) Header: Accept-Language header crunched and replaced with: Accept-Language: en-au
May 05 15:44:16 Privoxy(0810d800) Header: addh-unique: Host: blog.fefe.de
May 05 15:44:16 Privoxy(0810d800) Request: blog.fefe.de/
May 05 15:44:16 Privoxy(0810d800) Connect: to blog.fefe.de
May 05 15:44:16 Privoxy(0810d800) Connect: SOCKS4 negotiation write failed...
May 05 15:44:16 Privoxy(0810d800) Connect: connect to: blog.fefe.de failed: Broken pipe

Zweiter Versuch

Tor wurde wieder gestartet und die die Seite erneut aufgerufen. Firefox setzte den If-Modified-Since-Header:

http://blog.fefe.de/

GET / HTTP/1.1
Host: blog.fefe.de
User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.0.2) Gecko/20060414 Firefox/1.5.0.2
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en,de-ch;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 600
Proxy-Connection: keep-alive
If-Modified-Since: Wed, 08 Jun 1955 12:00:00 GMT
Cache-Control: max-age=0

HTTP/1.x 200 Here you go
Server: Gatling/0.9
Content-Type: text/html; charset=utf-8
Content-Length: 16741
Last-Modified: Fri, 05 May 2006 05:38:44 GMT
Connection: close

Gatling musste ihn aber nicht überprüfen, da er vorher von Privoxy gefiltert wurde:

May 05 15:44:27 Privoxy(08085000) Connect: OK
May 05 15:44:27 Privoxy(08085000) Connect: accept connection ... 
May 05 15:44:27 Privoxy(0810d200) Header: New HTTP Request-Line: GET / HTTP/1.1
May 05 15:44:27 Privoxy(0810d200) Header: scan: GET / HTTP/1.1
May 05 15:44:27 Privoxy(0810d200) Header: scan: Host: blog.fefe.de
May 05 15:44:27 Privoxy(0810d200) Header: scan: User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.0.2) Gecko/20060414 Firefox/1.5.0.2
May 05 15:44:27 Privoxy(0810d200) Header: scan: Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
May 05 15:44:27 Privoxy(0810d200) Header: scan: Accept-Language: en,de-ch;q=0.5
May 05 15:44:27 Privoxy(0810d200) Header: scan: Accept-Encoding: gzip,deflate
May 05 15:44:27 Privoxy(0810d200) Header: scan: Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
May 05 15:44:27 Privoxy(0810d200) Header: scan: Keep-Alive: 600
May 05 15:44:27 Privoxy(0810d200) Header: scan: Proxy-Connection: keep-alive
May 05 15:44:27 Privoxy(0810d200) Header: scan: If-Modified-Since: Wed, 08 Jun 1955 12:00:00 GMT
May 05 15:44:27 Privoxy(0810d200) Header: scan: Cache-Control: max-age=0
May 05 15:44:27 Privoxy(0810d200) Header: Modified: User-Agent: Mozilla/5.0 (X11; U; FreeBSD sparc64; en-AU; rv:1.8.0.2) Gecko/20060428 Firefox/1.5.0.2
May 05 15:44:27 Privoxy(0810d200) Header: Suppressed offer to compress content
May 05 15:44:27 Privoxy(0810d200) Header: Crunching useless If-Modified-Since header.
May 05 15:44:27 Privoxy(0810d200) Header: crumble crunched: Keep-Alive: 600!
May 05 15:44:27 Privoxy(0810d200) Header: crumble crunched: Proxy-Connection: keep-alive!
May 05 15:44:27 Privoxy(0810d200) Header: Accept-Language header crunched and replaced with: Accept-Language: en-au
May 05 15:44:27 Privoxy(0810d200) Header: addh-unique: Host: blog.fefe.de
May 05 15:44:27 Privoxy(0810d200) Request: blog.fefe.de/
May 05 15:44:27 Privoxy(0810d200) Connect: to blog.fefe.de
May 05 15:44:37 Privoxy(0810d200) Connect: OK
May 05 15:44:38 Privoxy(0810d200) Header: scan: HTTP/1.0 200 Here you go
May 05 15:44:38 Privoxy(0810d200) Header: scan: Server: Gatling/0.9
May 05 15:44:38 Privoxy(0810d200) Header: scan: Content-Type: text/html; charset=utf-8
May 05 15:44:38 Privoxy(0810d200) Header: scan: Content-Length: 16741
May 05 15:44:38 Privoxy(0810d200) Header: scan: Last-Modified: Fri, 05 May 2006 05:38:44 GMT
May 05 15:44:41 Privoxy(0810d200) Header: scan: HTTP/1.0 200 Here you go
May 05 15:44:41 Privoxy(0810d200) Header: scan: Server: Gatling/0.9
May 05 15:44:41 Privoxy(0810d200) Header: scan: Content-Type: text/html; charset=utf-8
May 05 15:44:41 Privoxy(0810d200) Header: scan: Content-Length: 16741
May 05 15:44:41 Privoxy(0810d200) Header: scan: Last-Modified: Fri, 05 May 2006 05:38:44 GMT
May 05 15:44:41 Privoxy(0810d200) Header: scan: Connection: close
May 05 15:44:41 Privoxy(0810d200) Header: crumble crunched: Connection: close!
May 05 15:44:41 Privoxy(0810d200) Header: Adjust Content-Length to 16741