htaccess - Wie kann der Browser des Clients gezwungen werden, den Cache zu leeren?

72

Für meine Site habe ich die folgenden Zugriffsregeln:

# BEGIN Gzip
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript
</IfModule>
# END Gzip

# BEGIN EXPIRES
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 10 days"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType text/plain "access plus 1 month"
    ExpiresByType image/gif "access plus 1 month"
    ExpiresByType image/png "access plus 1 month"
    ExpiresByType image/jpeg "access plus 1 month"
    ExpiresByType application/x-javascript "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
    ExpiresByType application/x-icon "access plus 1 year"
</IfModule>
# END EXPIRES

Ich habe gerade meine Seite aktualisiert und es sah alles verrückt aus, bis ich meinen Cache geleert habe. Wie kann ich den Browser des Clients zwingen, den Cache nach einem Update zu leeren, damit der Benutzer die Änderungen sehen kann?

Krise
quelle
1
Ähnliches Problem?: Stackoverflow.com/questions/1207492/…
Seyeong Jeong
5
Sie müssen die URLs der Ressourcen ändern. B. durch Umbenennen des Ordners, der die Ressourcen enthält, oder des Dateinamens selbst. Google cache bustingfür weitere Informationen.
Gerben
Hier finden Sie eine bessere Lösung: stackoverflow.com/questions/118884/…
Luca Mori Polpettini
Schauen Sie sich diese Frage an, ich denke, sie kann Ihnen helfen: [ stackoverflow.com/questions/11532636/… [1]: stackoverflow.com/questions/11532636/…
Marcio Mazzucato

Antworten:

113

Sie können Browser zwingen, etwas zwischenzuspeichern, aber

Sie können Browser nicht zwingen, ihren Cache zu leeren.

Daher besteht die einzige Möglichkeit (AMAIK) darin, eine neue URL für Ihre Ressourcen zu verwenden. So etwas wie Versionierung.

Saeed Neamati
quelle
3
Jep. genau das. Sie sagen sogar in Ihrem htaccess, dass Sie sich nicht einmal die Mühe machen, den Server zu kontaktieren, bevor 10 Tage vergangen sind.
Tassos Bassoukos
Kontaktiert die zwischengespeicherte URL den Server für Änderungen oder stellt sie beim Laden der URL überhaupt keine Verbindung her, selbst wenn Sie vollständig offline sind?
diti
1
Diese Antwort ist etwas veraltet. Ist das noch eine wahre Aussage?
Craig London
4
@CraigLondon - es ist eine Frage der Formulierung ... das ist immer noch wahr; Sie können jedoch einen Browser zwingen, seinen Cache beim Laden für Ihre Site zu aktualisieren,
Matt Jackson
1
@dustytrash, AMAIK = Soweit ich weiß
Saeed Neamati
63

Wie andere Antworten bereits sagten, ist das Ändern der URL eine gute Cache-Busting-Technik. Es ist jedoch eine Menge Arbeit, eine größere Site zu durchsuchen, alle URLs zu ändern und auch die Dateien zu verschieben.

Eine ähnliche Technik besteht darin, der URL-Zeichenfolge, die entweder eine zufällige Zeichenfolge / Nummer oder eine Versionsnummer ist, einfach einen Versionsparameter hinzuzufügen und nur auf die geänderten Dateien abzuzielen.

Wenn Sie beispielsweise das CSS Ihrer Site ändern und es bis zu einer erzwungenen Aktualisierung wackelig aussieht, fügen Sie es einfach ?ver=1.1dem CSS-Import am Anfang der Datei hinzu. Dies ist für den Browser eine andere Datei, aber Sie müssen nur den Import ändern, nicht den tatsächlichen Speicherort oder Namen der Datei.

z.B:

<link href="assets/css/style.css" rel="stylesheet" type="text/css" />

wird

<link href="assets/css/style.css?ver=1.1" rel="stylesheet" type="text/css" />

Funktioniert auch hervorragend für Javascript-Dateien.

totalNotLizards
quelle
2
einfach, leicht und das Beste daran. Versucht vor htaccess, aber einfach nicht funktioniert ...
HC
Obwohl die akzeptierte Antwort dies angibt, liefert diese weitere Informationen. Dies sollte meiner Meinung nach die akzeptierte Antwort sein.
Jh62
? ver = 1.1 / 1.2 / 1.3 etc funktioniert nicht in vielen Browsern
Ian
@ Ian kannst du das näher erläutern? Ich möchte die Antwort aktualisieren, wenn dies nicht in allen Fällen funktioniert.
totalNotLizards
@totallyNotLizards Ich habe denselben Ansatz verwendet, bis mir klar wurde, dass einige Browser (insbesondere Chrome) geänderte Parameter NICHT als anderen Dateispeicherort erkennen. Daher habe ich den unten erwähnten htaccess-Ansatz implementiert.
Ian
18

Ich habe dein Problem ...

Wir können zwar den Client-Browser-Cache vollständig leeren, aber Sie können Ihrer Anwendung Code hinzufügen, damit Ihre letzten Änderungen den Client-Browser widerspiegeln.

In Ihrem <head>:

<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

Quelle: http://goo.gl/JojsO

RAJ
quelle
5

Sie können die Browser nicht zwingen, den Cache zu leeren.

Ihre HTML-Datei scheint früher neu geladen zu werden, da sie nach 10 Tagen abläuft. Sie müssen lediglich Ihre HTML-Datei aktualisieren und alle Ihre Dateien in einen neuen Ordner verschieben, z. B. version-2/oder eine Versionskennung an jede Datei anhängen, z mypicture-2.jpg. Anschließend verweisen Sie auf diese neuen Dateien in Ihrer HTML-Datei, und der Browser lädt sie erneut, da sich der Speicherort geändert hat.

Alex
quelle
3

Sie können dem Browser mitteilen, dass Ihre Site niemals zwischengespeichert wird, indem Sie den folgenden Code in den Header einfügen

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

Und um js, css cache zu verhindern, können Sie das Tool verwenden, um die Skripte zu minimieren und zu verschleiern, die jedes Mal einen zufälligen Dateinamen generieren sollten. Das würde den Browser zwingen, sie auch vom Server neu zu laden.

Hoffentlich hilft das.

Tim Hong
quelle
2
Das Schöne an Stackoverflow ist, dass potenzielle Lösungen angeboten werden, die die Frage des Ausstechers nach OP möglicherweise nicht erfüllen, es ihm jedoch ermöglichen, ein ähnliches Ergebnis zu
erzielen
Das hat bei mir funktioniert. WordPress lud die Datei index.php weiter herunter, als die Datei entfernt wurde. Die Verwendung dieser Header in meiner htaccess-Datei hat das Problem behoben
Meilenstewart88
3

In meinem Fall ändere ich eine bestimmte JS-Datei häufig und muss in allen Browsern, in denen sie verwendet wird, in der letzten Version vorliegen.

Ich habe keine bestimmte Versionsnummer für diese Datei, daher habe ich einfach das aktuelle Datum und die aktuelle Uhrzeit (Stunde und Minute) gehasht und als Versionsnummer übergeben:

<script src="/js/panel/app.js?v={{ substr(md5(date("Y-m-d_Hi")),10,18) }}"></script>

Ich muss es jede Minute laden, aber Sie können entscheiden, wann es neu geladen werden soll.

mkmnstr
quelle
1

Sie können "Zugriff plus 1 Sekunde" festlegen und auf diese Weise wird es aktualisiert, wenn der Benutzer das nächste Mal die Site betritt. Behalten Sie die Einstellung für einen Monat bei.

Radu
quelle
1

Das Folgende hilft Ihnen jetzt nicht mehr bei Dateien, die bereits zwischengespeichert sind. In Zukunft können Sie jedoch Folgendes verwenden, um eine Anforderung auf einfache Weise zu erzwingen, etwas Neues zu erhalten, ohne den tatsächlichen Dateinamen zu ändern.

# Rewrite all requests for JS and CSS files to files of the same name, without
# any numbers in them. This lets the JS and CSS be force out of cache easily
# by putting a number at the end of the filename
# e.g. a request for static/js/site-52.js will get the file static/js/site.js instead.
<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule ^static/(js|css)/([a-z]+)-([0-9]+)\.(js|css)$ /site/$1/$2.$4 [R=302,NC,L]
</IfModule>

Je weiter oben in Ihrer Ordnerstruktur Sie diesen Ansatz wählen, desto mehr werden Sie mit einer einfachen Änderung aus dem Cache werfen.

Zum Beispiel, wenn Sie das gesamte CSS und Javascript Ihrer Site in einem Hauptordner speichern

/assets/js
/assets/css
/assets/...

Dann können Sie damit beginnen, es in Ihrem HTML als "Assets-XXX" zu bezeichnen, und eine Regel wie diese verwenden, um den gesamten Inhalt der Assets aus dem Cache zu entfernen.

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule ^assets-([a-z0-9]+)/(.*) /$2 [R=302,NC,L]
</IfModule> 

Beachten Sie, dass Sie in diesem Fall den 302 in einen 301 ändern, nachdem Sie ihn zum Laufen gebracht haben. Dann wird das Caching aktiviert. Wenn es sich um einen 302 handelt, wird er auf Browserebene nicht zwischengespeichert, da es sich um eine temporäre Umleitung handelt. Wenn Sie dies auf diese Weise tun, können Sie die Ablaufzeit für alle Assets auf 30 Tage erhöhen, da Sie die Daten einfach aus dem Cache entfernen können, indem Sie einfach den Ordnernamen auf der Anmeldeseite ändern.

<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresDefault A2592000
</IfModule>
Brad Parks
quelle
0

Am einfachsten ist es, der Anforderung eine Dateizeit hinzuzufügen. z.B

myfile.txt? 2014-10-30-13: 12: 33

Versionierung nach Datum.

na8ur
quelle
0

Ändern Sie den Namen der CSS-Datei. Laden Sie die Seite und ändern Sie die Datei erneut in dem ursprünglichen Namen, der für mich funktioniert.

www.quixoticguide.com
quelle
0

Verwenden Sie das Mod-Rewrite mit R = 301 - wobei Sie eine inkrementelle Versionsnummer verwenden:

Um> css / ver / file.css => css / file.css zu erreichen? V = ver

RewriteRule ^ css / ([0-9] +) / file.css $ css / file.css? V = $ 1 [R = 301, L, QSA]

Beispiel: css / 10 / file.css => css / file.css? v = 10

Gleiches kann auf js / files angewendet werden. Inkrementieren, um die Aktualisierung zu erzwingen, 301 erzwingt einen erneuten Cache

Ich habe dies in Chrome, Firefox, Opera usw. Getestet

PS: Das? V = ver dient nur der Lesbarkeit, dies führt nicht zu einer Aktualisierung

Ian
quelle
-1

Das hat bei mir funktioniert.

suche danach:

    DirectoryIndex index.php

durch Folgendes ersetzen:

    DirectoryIndex something.php index.php

Seite hochladen und aktualisieren. Sie erhalten einen Seitenfehler.

Ändern Sie es einfach wieder in:

    DirectoryIndex index.php

Seite erneut hochladen und aktualisieren.
Ich habe dies auf allen meinen Geräten überprüft und es hat funktioniert.

Lorenzo B.
quelle