HTML/PHP - jak zakázat načítání obrázku z cache?
Zdravím vespolek,
řeším následující problém: na www stránce je obrázek, jako upoutávka na nějakou akci - akce.jpg. Tento obrázek se bude měnit, podle toho, jaká bude zrovna akce na nějaké zboží. Takže uživatel vždy přes FTP nahraje (přepíše) nový soubor akce.jpg.
Když ale nahraju přes FTP nový obrázek, zavřu prohlížeč, otevřu prohlížeč a znovu stránku zobrazím, stále tam je ten původní starý obrázek. Teprve po obnovení klávesou F5 se načte nový obrázek.
V hlavičce mám toto:
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Expires" content="-1" />
Zkoušel jsem ještě zobrazení obrázku upravit takto, aby URL adresa byla pokaždé jiná a abych tím donutil prohlížeč načíst nový obrázek:
echo "<img src=upload/akce.jpg\""."?dummy=".time()."\" width=\"600\" height=\"300\" alt=\"akce\" />";
Z toho se vygeneruje toto:
<img src="upload/akce.jpg?dummy=1392199872" width="600" height="300" alt="akce" />
Ale nepomohlo to. Žádám tedy o radu.
Děkuju.
Nemáš tam divně uvozovky?
Zkus:
S uvozovkama jsem možná udělal chybu teď při přepisu, jméno souboru a rozměry obrázku mám jako proměnné, tak jsem to chtěl pro přehlednost zjednodušit. Takže uvozovkama to myslím nebude. Stránka je validní.
Tohle prej pomohlo. Resi to tam sice v JS, ale melo by se to dat pouzit i na PHP...
http://stackoverflow.com/questions/1077041/refresh -image-with-a-new-one-at-the-same-url
Abych pravdu řekl, nevidím v tom nic nového, co bych tam neměl a nezkusil já?
Metatagy pro zákaz cachování mám a přidání času do URL obrázku jsem zkusil taky.
Treba ten parametr max-age a # misto ? v tom URL na obrazek...
Podle informací, které jsem našel, tak parametr "no-cache" by měl být ještě striktnější než "max-age", takže to asi problém neřeší. Nahrazení otazníku křížkem nemá efekt.
Já myslím, že by měla fungovat ta konstrukce s tím dummy. Akorát se mi nelíbí ty uvozovky hned za sebou. Zkusil bych to, jak to navrhujou třeba tady
Víc je toho třeba tady http://stackoverflow.com/questions/728616/disable- cache-for-some-images
Uvozovky hned za sebou? Výsledný HTML kód je správný, v tom myslím problém není.
Ještě mě napadá, označit obrázek nějakým id a javascriptem načíst src (přidat přímo v js za src lokální datum).
Netvrdím, že to pomůže, ale když selhalo všechno předtím, zkusil bych i toto.
//Editace
A ještě mě napadá, jestli otevření prohlížeče není "cache only" akce.
Protože já když otevřu prohlížeč, tak stránky naběhnou na úplně stejném místě a žádné skripty se neaktivují, takže nemají smysl.
Javascript bych do toho nerad montoval, doufám, že to lze udělat i bez něj?
S tím otevřením prohlížeče na tom možná něco bude. Protože když si zobrazím zdroják, tak podle toho timestampu vidím, že se otevřela vlastně nakešovaná stránka. Teprve po refreshi se změní timestamp a zobrazí správný obrázek. Takové chování prohlížeče mě ale poněkud deprimuje.
Mě deprimuje taky, protože použitý způsob jsem dosud považoval za spolehlivý.
Nabízí se přirozená otázka: chovají se tak všechny prohlížeče ?
Úmyslně jsem nepsal, v jakém prohlížeči jsem to testoval (Firefox), protože i kdyby to v jiném fungovalo, můj problém to neřeší. Potřebuju univerzální řešení, aby to fungovalo všem a všude.
Vždy jsi vydán na milost a nemilost autorům prohlížeče.
Univerzální řešení všem a všude existuje, jen pokud záležitost vyřešíš na straně serveru (jménem souboru, kdy PHP vybere soubor s nejnovějším datem - určitě znáš další a asi je nemůžeš v tomto konkrétním případě použít).
Další přirozená otázka nad rámec tohoto tématu: platí stejná nejistota i v případě souborů .js a .css ?
Často to používám při ladění.
Jak psal TarasBulba je podle mě správné chování. Když prohlížeč to bere z cache, tak se řeší tím, že se mu vždy podstrčí jiná URL, aby nemohl nic načítat z cache, protože na dané URL ještě nebyl. To že URL je stejná a mění se pouze parametr za "?" nebo "&" už není podstatné. Zkus to napsat znova, a tak jak zde bylo řečeno.
Po spuštění prohlížeče napíšeš URL, nebo prohlížeč si zobrazí z paměti naposled prohlíženou stránku?
Nevím, co tím máš na mysli.
Po spuštění prohlížeče napíšu do adresního řádku URL. Samozřejmě se mi během psaní zobrazí celá adresa, protože si ji prohlížeč pamatuje. Ale i když pro jistotu kliknu na šipku "přejít", aby neotevřel nejakou starou verzi z cache ale přešel na aktuální verzi ze serveru, tak se to chová tak, jak jsem psal => zobrazí stránku z cache.
Tím myslím naspat znova ten kód, ačkoliv se ti zdá stejný (nic nekopírovat, ale napsat to znova od začátku).
Pro ukázku zde mám taky jeden kód (nedívej se na to, že stránka je celá blbě), jde o řádky 30 a 31, které jsou identické, když se na ně podíváš, ale na webu se ukazuje pouze jedna ikonka:
pokus.php
Takže problémy sú 2: kešuje sa stránka a kešuje sa obrázok. Oba problémy sa dajú vyriešiť správnym nastavením HTTP hlavičiek. HTTP hlavičky majú prednosť pred ich ekvivalentami v HTML stránke. Navyše, hlavičky pre HTML stránku nijako neovplyvňujú kešovanie samotného obrázka.
Takže si pozri, aké HTTP hlavičky sa posielajú pre danú HTML stránku a uprav ich tak, aby posielali to, čo si dal do HTML (Pragma: no-cache, Cache-Control: no-cache). Z HTML to potom zmaž.
Pre obrázok stačí v podstate ten dummy parameter, ale zasa sa pripravíš o to, aby sa použila cache, keď sa obrázok nezmenil. Takže ak server generuje E-Tagy alebo Last-Modified hlavičky, tak to môžeš nechať aj bez toho parametra.
Děkuji všem zúčastněným za cenné rady a pomoc. Speciální poděkování losovi.
Použil jsem následující hlavičky:
A zdá se, že to funguje přesně tak, jak jsem požadoval. Stačí přes FTP změnit obrázek, otevřít znovu prohlížeč a vždy se načte aktuální obrázek. Paráda..... Uf.
DOpourčil bych toto
http://www.jakpsatweb.cz/clanky/caching-tutorial-c zech-translation.html
Funguje tohle 2023
Toto je zbytočný balast, ono funguje aj to z 2014.
Ale čítanie pobavilo :)
Není cachovaná i html stránka obsahující ten query string?
Dotaz byl vyřešen v roce 2014...