PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Apache und Cache Header



rep
22.07.10, 12:29
Hallo,

ich versuche gerade eine Anwendung den Proxy-Server und Browser davon zu überzeugen es sollte der Cache verwendet werden. Dies mache ich mit einigen Headern. Der Inhalt ist erstmal egal. Mein Problem ist, ich will eine Datei haben, die über einen anderen Namen abgerufen wird (mod_rewirte) und nur wenn Sie über einen anderen als den Realen Namen abgerufen wird soll der Cache Header gesendet werden.

Es gibt also eine Datei "test.css" und diese wird im Quellcode mittels "test-1234567890.css" an den Browser gesendet, so das der Browser und Proxy-Server beim Besucher diese Datei anfragt. Ändert sich der Inhalt, ändere ich den Quellcode auf "test-0987654321.css" und es ist für den Browser und den Proxy-Server eine neue Datei, welche nicht im Cache liegt.

Wenn das klappt, ist man in der Lage die Cache Header auch so zu setzen das die dateien für Monate oder Jahre (theoretisch) im Cache bleiben können, jedoch im System die Datei immer gleich heißt.

Folgende klappt genau wie ich das möchte. Das ist echt Super.



<FilesMatch "\.(js|css)$">
RewriteEngine On
RewriteRule ^(.*)-[0-9]+.(js|css)$ $1.$2 [L]
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "now plus 3600 seconds"
<IfModule mod_headers.c>
Header set Cache-Control "public, s-maxage=3600, proxy-revalidate, max-age=3600, must-revalidate"
</IfModule>
</IfModule>
</FilesMatch>


Nun ist zur Sicherheit eine Weitere Anforderung hinzugekommen, die nicht klappt. Und zwar soll aus Sicherheitsgründen kein Cache Header gsetzt werden wenn die Datei noch auf "altem" weg eingebunden wird. Also die Originale existierende Datei. "test.css". Damit an stellen wo das Ändern versäumt wurde kein langer Cache greift und so Änderungen nicht greifen.

Ich habe Versucht "<FilesMatch "\.(js|css)$">" ebenfalls mit dem RegEx aus der RewriteRule zu verwenden, dann kommt aber kein Header, da der FilesMatch die umgeschrieben also Real forhandene Datei nimmt. Ebenfalls <LocationMatch> habe ich versucht, das geht ebenfalls nicht. Jemand eine Idee wie man das umsetzen kann?