Правильно отдаем код 304. Пример на PHP?

12
E
На сайте с 08.04.2001
Offline
221
4326

У меня большой сайт с огромным количеством ссылок. Поэтому хотелось бы настроить правильный ответ сервера на If-modified-since.

RFC 2616

14.25 If-Modified-Since

The If-Modified-Since request-header field is used with a method to

make it conditional: if the requested variant has not been modified

since the time specified in this field, an entity will not be

returned from the server; instead, a 304 (not modified) response will

be returned without any message-body.

Вопрос. If-Modified-Since передают только поисковые боты?

An example of the field is:

If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT

Вопрос. Как на PHP можно эту информацию получить в переменную для последующей обработки.

c) If the variant has not been modified since a valid If-

Modified-Since date, the server SHOULD return a 304 (Not

Modified) response.

Вопрос Какой собственно header для этого нужно будет отправить? И будет ли он правильно обработан. Сервер все равно ведь дату изменения документа будет отправлять?

Может быть проще забить на это все и просто ручками прописывать новые страницы сервера на закормочной странице?

C
На сайте с 19.09.2001
Offline
120
#1
If-Modified-Since передают только поисковые боты?

Нет, браузеры и прокси тоже.

Как на PHP можно эту информацию получить в переменную для последующей обработки.

Посмотрите описание для функции apache_request_headers

Какой собственно header для этого нужно будет отправить? И будет ли он правильно обработан. Сервер все равно ведь дату изменения документа будет отправлять?

HTTP/1.1 304 Not Modified

Да, будет.

Откуда сервер будет брать дату? Это Вам решать, отправлять ее или нет.

;)

С уважением, Владимир Чернышов. (не)?путевые заметки (http://chernyshov.kiev.ua/)
E
На сайте с 08.04.2001
Offline
221
#2

Cherny,

Посмотрите описание для функции apache_request_headers

Вот что выдает мне эта функция Accept: */*

Accept-Language: ru,en;q=0.5

Cache-Control: no-cache

Connection: Keep-Alive

Cookie: PHPSESSID=821bc3a786f67e26e849358f1e90e2fa; PHPSESSID=821bc3a786f67e26e849358f1e90e2fa

Host: www.site.com

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

Как их массива выбрать элемент относящийся к If-Modified-Since?

[Удален]
#3

А в данном случае этого заголовка и нету. :)

Я ссылку с примером давал в одном из свежих топиков, где всплыла тема кода 304, там все замечательно объяснено.

E
На сайте с 08.04.2001
Offline
221
#4

Interitus,

А в данном случае этого заголовка и нету.

Это я и сам вижу. Я же не Googlebot-ом страницу смотрю :) Но теоретически он там есть среди них для определенных агентов.

C
На сайте с 19.09.2001
Offline
120
#5
Как их массива выбрать элемент относящийся к If-Modified-Since?

$requests=apache_request_headers();

$what_you_want=$requests['If-Modified-Since']
E
На сайте с 08.04.2001
Offline
221
#6

Cherny,

$what_you_want=$requests['If-Modified-Since']

Странно. У меня не получалось. Правда я пробовал $requests['User-Agent'], чтобы проверить работает ли наверняка.

Впрочем очень хорошую разработку проблемы и ее решения я нашел тут

http://www.webmasterworld.com/forum88/1857.htm

И кое что интересного тут

http://www.manucorp.com/archives/pear-dev/200312/msg00516.php

C
На сайте с 19.09.2001
Offline
120
#7
Странно. У меня не получалось.

У меня все получилось и все работает.

Back Door Man
На сайте с 20.08.2003
Offline
151
#8

apache_request_headers(); - работает не во всех версиях РНР (PHP 4 >= 4.3.0).

Надежнее - $HTTP_SERVER_VARS["HTTP_IF_MODIFIED_SINCE"]

И еще, в РНР начиная, кажется с 4.3.3 сервер подавляет вывод кода ответа, и выдает насильно 200 ОК, если вы выдали заголовок Last-Modified

Будьте внимаетельны, и, да прибудет с вами сила :)

Дмитрий
А
На сайте с 29.07.2003
Offline
58
#9

Проблема в том что некоторые браузеры (MSIE 6 например) спрашивают как


If-Modified-Since: Tue, 21 Oct 2003 18:29:09 GMT; length=61

что не совсем дата :D

[Удален]
#10

Сайт порядка 10000-15000 страниц

и каждую неделю добавляется 1000-1500 страниц.

Надо не гонять поисковики по старым страницам а подсовывать новые.

Вот такая конструкция будет работать?

$timedate=$HTTP_SERVER_VARS["HTTP_IF_MODIFIED_SINCE"];

if (!empty($HTTP_SERVER_VARS["HTTP_IF_MODIFIED_SINCE"])) {
header("HTTP/1.1 304 Not Modified");
header("last-modified: $timedate"); }
else {
header("last-modified: ".gmdate("D, d M Y H:i:s", time()-86400)." GMT"); }

Это поможет? Не будет ли проблем и осложнений при индексации?

Может быть есть еще варианты?

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий