IF-NONE-MATCH

dzimedrol

Новичок
IF-NONE-MATCH

Уже начинаю тупить... Настроил проверку кэширования через If-Modified-since, все работает. Но понял, что мне этого не хватает - нужна более полная информация о странице, чем просто дата. Решил использовать md5-хэш через Etag. Вот как выглядит обмен заголовками браузера с сервером:

GET http://blablabla HTTP/1.1
Host: blablabla
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive
If-None-Match: ac021954d544fb7c978d65d06e5a3459

HTTP/1.x 200 OK
Connection: close
Proxy-Connection: close
Date: Wed, 23 Nov 2005 09:27:56 GMT
Server: Apache/1.3.33 (Unix) mod_choke/0.06 mod_gzip/1.3.26.1a mod_auth_passthrough/1.8 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_ssl/2.8.22 OpenSSL/0.9.7d
Etag: ac021954d544fb7c978d65d06e5a3459
Content-Type: text/html


Скрипт, к которому идет обращение, распечатывает getallheaders() и $_SERVER[], вот что он выдает:

Array
(
[DOCUMENT_ROOT] => blablabla
[HTTP_ACCEPT] => text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
[HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.7
[HTTP_ACCEPT_ENCODING] => gzip,deflate
[HTTP_ACCEPT_LANGUAGE] => en-us,en;q=0.5
[HTTP_CONNECTION] => Keep-Alive
[HTTP_HOST] => blablabla
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4
[PATH] => /bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin
[REMOTE_ADDR] => blablabla
[REMOTE_PORT] => blablabla
[SCRIPT_FILENAME] => blablabla
[SERVER_ADDR] => blablabla
[SERVER_ADMIN] => blablabla
[SERVER_NAME] => blablabla
[SERVER_PORT] => 80
[SERVER_SIGNATURE] =>
[SERVER_SOFTWARE] => Apache/1.3.33 (Unix) mod_choke/0.06 mod_gzip/1.3.26.1a mod_auth_passthrough/1.8 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_ssl/2.8.22 OpenSSL/0.9.7d
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.0
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => blablabla
[SCRIPT_NAME] => blabla
[PATH_TRANSLATED] => blablabla
[PHP_SELF] => blablabla
[argv] => Array
(
)

[argc] => 0
)
Array
(
[Accept] => text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
[Accept-Charset] => ISO-8859-1,utf-8;q=0.7,*;q=0.7
[Accept-Encoding] => gzip,deflate
[Accept-Language] => en-us,en;q=0.5
[Connection] => Keep-Alive
[Host] => blablabla
[User-Agent] => Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4
)

Дело в том, что тут нет If-None-Match! Но Live HTTP headers-то его показал!
 

SiMM

Новичок
http://phpclub.ru/talk/showthread.php?threadid=76657
> Дело в том, что тут нет If-None-Match! Но Live HTTP headers-то его показал!
А какое отношение Live HTTP headers имеет к тому, что доходит до сервера вообще и PHP в частности?

> [SERVER_SOFTWARE] => Apache/1.3.33 (Unix) mod_choke/0.06 mod_gzip/1.3.26.1a mod_auth_passthrough/1.8 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_ssl/2.8.22 OpenSSL/0.9.7d
Особенно если учесть, что PHP, судя по всему, стоит как CGI, а не модулем.
 

dzimedrol

Новичок
Прочитал. НО: HTTP-IF-MODIFIED-SINCE доходит и прекрасно появляется в $_SERVER...
 

dzimedrol

Новичок
Затык в формировании MD5-хеша, почему то вот он и не пролазит. Если вместо него слать crc32 - все отлично. То-ли по длине он не пролазит, то-ли еще что - не знаю.


Подскажите пожалуйста, какие есть ограничения на размер HTTP 1.1 заголовков, что-то в RFC я не нашел (плохо искал?).
 

Profic

just Profic (PHP5 BetaTeam)
Rfc нужно более внимательно читать.
По крайней мере, как я его понял, значение ETag-а должно быть в кавычках.
 

whirlwind

TDD infected, paranoid
Я тож об этом подумал, ведь там есть спецификаторы, которые нужно как то отделить от самого etag-а.
 

Profic

just Profic (PHP5 BetaTeam)
Какие-такие спецификаторы? Или разговор про "W/"? Так он вне кавычек пишется. Т.е.:
ETag: "чего хочешь кроме кавычки, а если она нужна, то ее за-backslash-ить"
или
ETag: W/"чего хочешь кроме кавычки, а если она нужна, то ее за-backslash-ить"
 

dzimedrol

Новичок
Они и есть у меня в кавычках, я сейчас вот код приведу:

$MyETAG='"'.md5($recordhash).'"';


if(isset($_SERVER["HTTP_IF_NONE_MATCH"])) {
if (stripslashes($_SERVER["HTTP_IF_NONE_MATCH"]) == $MyETAG) {
header("HTTP/1.1 304 Not Modified");
exit;
}
}
header("Etag: ".$MyETAG);

Вот конкретно этот код не работает. Стоит заменить md5 на crc32 или просто константу строковую забить вроде 1231232 - все отлично.
 

whirlwind

TDD infected, paranoid
entity-tag = [ weak ] opaque-tag
weak = "W/"
opaque-tag = quoted-string

Пример

Wed Nov 23 17:37:46 2005 ETag: "3501f0-5e2a00-8b5c2340"

Блин, сомнительно конечно... Мож ее как то енкодить надо?

-~{}~ 23.11.05 17:50:

Кста, попробуй Last-Modified добавить.
 

dzimedrol

Новичок
Се, вообще я ничего не понял. На работе из-за кучи проксей не работало - хоть ты тресни. Дома - пожалуйста, все работает. Я не знаю, как это объяснить, но оно уже работает. Причем именно так, как я писал.
$MyETAG='"'.md5($recordhash).'"';


if(isset($_SERVER["HTTP_IF_NONE_MATCH"])) {
if (stripslashes($_SERVER["HTTP_IF_NONE_MATCH"]) == $MyETAG) {
header("HTTP/1.1 304 Not Modified");
exit;
}
}
header("Etag: ".$MyETAG);
Всем пасиба.
 
Сверху