Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите разобраться с HTTP заголовками. PHP

312
31 декабря 2009 года
dead_star
392 / / 26.11.2006
так, попробую описать все по порядку
я хочу разобраться с заголовками которые надо отправлять клиенту
я поковырялся в манах и полазил по форумам
вот что у меня получилось

Основные заголовки
основные это Content-Type и HTTP Status
тут все обыденно
 
Код:
header("HTTP/1.0 200 OK");
header("HTTP/1.1 200 OK");
header("Content-Type: text/html;charset=windows-1251");


Отмена кэширования
на сколько я понимаю для того чтобы отменить кэшировать страницы
необходимо отправить следующие заголовки:
 
Код:
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
// документ считается устаревшим - в прошлом
header("Expires: ".gmdate("D, d M Y H:i:s", 0)." GMT");
// последний раз изменялся - сейчас
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");


Кэширование
для включения кэширования отправить заголовки:
 
Код:
// 60 секунд - время жизни кэша
header("Cache-Control: public,max-age=60");
// документ считается устаревшим - дата изменения файла + 60 секунд
header("Expires: ".gmdate("D, d M Y H:i:s", getlastmod()+60)." GMT");
// последний раз изменялся - дата изменения файла
header("Last-Modified: ".gmdate("D, d M Y H:i:s", getlastmod())." GMT");


If-Modified-Since
этот заголовок отправляется браузером когда он хочет проверить обновилась ли страница
если отключено кэширование то необходимо отправить ответ 304 Not Modified в случае если страница не изменялась
говорят что если PHP работает через CGI, а не установлен как модуль Apache
то заголовка HTTP_IF_MODIFIED_SINCE там не будет
в моем случае PHP установлен как модуль Apache
получается что-то вроде
 
Код:
if (strtotime(getenv("HTTP_IF_MODIFIED_SINCE") >= getlastmod()){
 header("HTTP/1.0 304 Not Modified");
 header("HTTP/1.1 304 Not Modified");
 exit;
}


но есть проблема
тесты показали что если на странице есть старт сессии session_start() то ничего не работает
у меня система устроена таким образом что сессия стартует на каждой странице
делать старт сессии только для тех страниц где это действительно надо очень сложно
да и во многих случаях старт сессии действительно необходимо делать на каждой странице
например на этом форуме при отправке заголовка If-Modified-Since возвращается HTTP Status 200 OK
а возможно этот заголовок вообще не надо ставить так как сервер сам все обрабатывает
но если я хочу отменить кэширование то он все таки нужен

ETag
ETag - это строка, которая однозначно идентифицирует конкретную версию компонента
формируется следующим образом
 
Код:
if (getenv("HTTP_IF_NONE_MATCH")){
 header("ETag: ".sprintf("%x-%x-%x", getmyinode(), filesize(getenv("SCRIPT_FILENAME")), getlastmod()));  
}

с этим примерно все ясно

в общем вопрос в следующем
правильно ли я понял все заголовки и правильные ли параметры я им передаю
возможно от каких то заголовков необходимо избавиться
а возможно какие то дописать
прошу помочь мне в этом вопросе
5.3K
05 января 2010 года
Somebody
185 / / 24.12.2006
Цитата:
Cache-Control: post-check=0, pre-check=0


Ни разу не видел, да и в RFC никаких "post-check" и "pre-check" не видно.

366
07 января 2010 года
int
668 / / 30.03.2005
Зато lighttpd их отправляет :) Через live http headers в firefox видно.
312
09 января 2010 года
dead_star
392 / / 26.11.2006
Цитата: Somebody
Ни разу не видел, да и в RFC никаких "post-check" и "pre-check" не видно.


на счет RFC незнаю, но гугл говорит:

Цитата:
Для того, чтобы позволить менеджеру веб-сайт регулировать частоту, с которой браузер должен запрашивать HTTP-сервер об изменениях в ресурсе, в Internet Explorer 5 представлено 2 расширения HTTP-заголовка Cache-Control: pre-check и post-check.


то есть получается что эти дополнения работают только для Internet Explorer 5
так как по данным LiveInternet на январь 2009 пользователи IE5 составляют всего 0,06% то эти заголовки можно и не использовать

Цитата:
post-check определяет интервал времени в секундах, после которого ресурс должен быть проверен на актуальность. Эта проверка может быть выполнена и после того, как пользователь загрузит страницу из кеша, но при следующей загрузке он обязательно должен получить обновленную версию.


Цитата:
pre-check определяет интервал времени в секундах, после которого проверка актуальности ресурса должна быть произведена перед его отображением для пользователя.


получается в случае кэширования можно добавить заголовок

 
Код:
header("Cache-Control: pre-check=60", false);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог