Спиране на клиента да вижда кеширана уеб страница

Намерих това за трудно да се изрази, така че моля, изтърпете ме.

Когато актуализирам уебсайт и помоля клиента да види промените, те винаги виждат кеширания резултат от последния път. Сега това не е проблем, тъй като мога да ги помоля да натиснат ctrl f5, за да опреснят целия кеш.

Въпросът ми е има ли начин да принудя клиентския браузър да опреснява автоматично цялото съдържание? и какъв е обичайният стандарт за това? Искам да продължа да използвам кеша, тъй като това ускорява уебсайта, просто мога да го кажа кога се е актуализирал.

Знам, че за javascript файлове и css файлове можете да промените името на файла, така че браузърът да го третира като нов файл и да го изтегли отново, напр. myCssFilev1.2.css, но какво да кажем за действителния HTML?


person user1528274    schedule 16.07.2012    source източник
comment
Мисля, че можете да използвате параметри на кеша в html заглавки askapache.com/htaccess/ apache-speed-cache-control.html   -  person Ozair Kafray    schedule 16.07.2012


Отговори (4)


Има няколко мета тагове за това:

<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />

Настройките за контрол на кеша, изтичане и pragma работят в различни браузъри, така че е най-добре да включите всички. Това трябва да реши проблема ви.

РЕДАКТИРАНЕ

Както Ариел отбеляза, трябва да внимавате с това. Ако това е ситуация с високо натоварване, вероятно искате да намерите друго решение. Можете да опитате да намерите "средната земя", но променяйки параметрите (настройка expires или max-age на cache-control до някаква стойност). Въпреки това, ако нямате безумно натоварване на сървъра, тогава това трябва да е наред.

person Doa    schedule 16.07.2012
comment
Да, не правете това, освен ако не искате нищо да се кешира. А ти не искаш това! (Освен ако не харесвате много бавни страници.) - person Ariel; 16.07.2012
comment
Ариел, въпросът е има ли начин да принудя клиентския браузър да опреснява автоматично цялото съдържание. Страхувам се, че това означава, че няма да се карате. - person Doa; 16.07.2012
comment
Поне не настройвайте изтичането на моментално. 1 ден - или дори 1 час кеш памет ще помогне изключително много. - person Ariel; 16.07.2012
comment
Още нещо: Ако това е PHP страница, не задавайте тези в мета елементи, използвайте функцията header(). За HTML страници мета елементите са по-лесни. - person Ariel; 16.07.2012
comment
благодаря на всички, мисля, че това, което работи най-добре, е да зададете кратко време на изтичане, както казва Ариел, но чрез htaccess можете да зададете различни типове файлове на различни времена на изтичане. Така че html може да се настрои на много ниско, а изображенията да се настроят на по-високо. Потребителят няма да види незабавно опресняване, но мисля, че е работещо. - person user1528274; 17.07.2012

да Да кажем, че имате включен javascript.

Do:

<SCRIPT src="file.js?<?=filemtime('file.js')?>"></SCRIPT>

Това, което прави, е да добави времето за модификация на файла към URL адреса за файла. Така че, когато промените файла, за браузъра той ще изглежда като нов файл и няма да бъде кеширан.

Имайте предвид, че постоянните filemtime повиквания могат да забавят нещата.

Можете да използвате комбинация от dirname() __FILE__ и PHP_SELF, за да изчислите автоматично физическата файлова страница от относителната и след това да я поставите във функция, така че да не се налага да въвеждате името на файла ръчно два пъти.

person Ariel    schedule 16.07.2012
comment
Обърнете внимание, че OP казва, че знам, че за javascript файлове и css файлове можете да промените името на файла, така че браузърът да го третира като нов файл и да го изтегли отново, напр. myCssFilev1.2.css, но какво да кажем за действителния HTML?. Това, което предлагате, е за JS и CSS, а не за HTML. - person Doa; 16.07.2012
comment
@dow Можете да направите абсолютно същото нещо за html файла - просто поставяте този код във връзки към html страниците. Ето защо предложих да напишем функция, за да стане бързо и лесно. - person Ariel; 16.07.2012
comment
Какво ще кажете за страницата, на която хората попадат тогава? Автоматично пренасочване към PHP_SELF?[randomnum] с помощта на mod_rewrite? Това е малко пресилено, нали? Интересна идея все пак. - person Doa; 16.07.2012
comment
@Dow Защо не? И нямате нужда от mod_rewrite, можете да накарате PHP да го направи. За допълнителен кредит накарайте PHP да прочете полето filemtime url, което сте подали, и ако то не съвпада с текущото време на модифициране за файла, предизвика презареждане с header('Location:..). Тогава не е нужно да се притеснявате за маркирани връзки. Можете дори да изключите полето от връзките, просто да ги оставите голи, след което да накарате PHP да провери дали полето е изпратено в URL адреса, ако не, да го накара да се презареди точно както би било за старо поле (въпреки че това ще забави нещата с постоянно прави двойни заявки за всяка връзка и работи само на PHP страници). - person Ariel; 16.07.2012

По-сложно е, отколкото изглежда. Честно казано смятам, че инструктирането на потребителя да изпразни кеша на браузъра си е най-лесният метод. В днешно време натискането на Ctrl+Shift+Del е бързо и работи в повечето браузъри, включително Internet Explorer.

person Álvaro González    schedule 16.07.2012
comment
Моля те, не го прави. Вместо това използвайте shift-reload. Не карайте потребителите си да изчистват кеш паметта си без причина. Обикновеното презареждане често също ще работи. - person Ariel; 16.07.2012

HTTP хедърът Last-Modified и Etag използват за намаляване на трафика в мрежата.

Браузърът изисква уеб сървъра с Last-Modified заглавка. Ако датата-час е същата като времето на файла на сървъра, сървърът просто отговаря 304. Или часът е различен, отговорът на сървъра 200 и пълното съдържание.

Etag извършва същия процес.

Има още подобни на If-Modified-Since , If-Unmodified-Since, вижте повече на etag, и rfc2616

person kimjxie    schedule 16.07.2012