Hallo zusammen,
ich habe einen einfachen Webserver nach der Vorlage von
http://www.ermicro.com/blog/?p=1773 auf einem Atmega2560 und W5100 mit
Atmelstudio programmiert. Der Client kann von Benutzer getätigte
Einstellungen an den Server zurücksenden. Dieser aktualisiert darauf hin
die Seite.
Neben der HTML Datei wird eine CSS Datei zum Client übertragen. Leider
wird nach jeder Aktualisierung vom Browser nach der CSS Datei gefragt.
Die CSS Datei ist relativ groß, und ihre Übertragung dauert lange. Ich
würde daher die CSS im Browser cache belassen wollen. Die Frage ist aber
wie, (bzw. warum der Browser nicht automatisch die CSS aus dem cache
holt.)
Es gab hier vor langer Zeit die gleiche Frage:
Beitrag "uC gehostete webseite vom PC browser cachen lassen"
Es soll per "HTTP-Header" und per "Content type" geschehen.
Das verstehe ich aber leider nicht: Auf die client Anfragen hin
1
GET / HTTP/1.1
2
Host: 192.168.1.10
3
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0
>>Hast du auch beim der CSS-Datei den Header Last-Modified gesetzt?
Genau das ist mein Problem, dass ich nicht weiß wie ich das machen kann.
Was ich bisher dazu gefunden war,
- war die Möglichkeit über eine .htaccess Datei die Expires-Zeit
einzustellen
(https://gtmetrix.com/add-expires-headers.html)
- oder über eine "Dynamic Style Sheets"
(http://www.webmasterpro.de/coding/article/php-in-css-dss-dynamic-style-sheet.html)
Letztere habe ich versucht folgendermaßen in den CSS-Datei anzufügen,
was nicht funktioniert hat.
Es gibt 4 Möglichkeiten eine Seite zu cachen.
1) Expires header:
Man sendet mit wann die seite Ablauft, das hast du bei der HTML Seite
bereits:
1
strcpy_P((char*)buf,PSTR("Expires: Fri, 31 Jan 2099 06:06:06 GMT\r\n"));
Das muss dann nurnoch dort hinzugefügt werden, wo die css datei gesendet
wird. 2099 ist aber doch etwas wenig.
2) Last Modified und If-Modified-Since header. Der erste wird vom server
gesendet, der zweite vom client. Wenn last modified vor oder gleich if
modified since ist sollte nur ein status 304 gesendet werden.
3) Etag. Von der url unabhängig. Der server sendet den Etag header mit,
der Browser If-None-Match und bei übereinstimmung wird nur 304 gesendet.
4) Application Cache. In einer Datei werden die zu Cachenden Dateien
angegeben. Diese sind dann selbst offline erreichbar. Aktualliserungen
müssen mit javascript erfolgen und was mal im cache ist ist in diesem
fall fast nichtmehr rauszukriegen.
Georg schrieb:>>>Hast du auch beim der CSS-Datei den Header Last-Modified gesetzt?> Genau das ist mein Problem, dass ich nicht weiß wie ich das machen kann.
Aber genau das ist zwingend erforderlich, Jede einzelne Datei brauch den
Header damit diese Datei gecached werden kann.
Du hast das jetzt nur für die Startseite gemacht, die müsste dann ach
gecached werden. Hast du dir das mal mit Wireshark angeschaut?
Und PHP auf einem Microkontroller bringt nichts wenn da kein
PHP-Interpreter läuft.
Zeig doch mal den Quellcode, wie hast du die CSS-Datei eingebunden