Как протестировать поддержку HTTP Header с поддержкой "If-Modified-Since"

Используя PHP, как я могу точно проверить, что удаленный веб-сайт поддерживает HTTP-заголовок If-Modified-Since.

Из того, что я прочитал, если удаленный файл GET был изменен с даты, указанной в запросе заголовка, он должен вернуть статус 200 OK. Если он не был изменен, он должен вернуть 304 Not Modified.

Поэтому мой вопрос: что, если сервер не поддерживает "If-Modified-Since", но все равно возвращает 200 OK?

Есть несколько инструментов, которые проверяют, поддерживает ли ваш сайт "If-Modified-Since", поэтому, я думаю, я спрашиваю, как они работают.

Edit:

Я провел некоторое тестирование с помощью Curl, отправив следующее:

curl_setopt($ch, CURLOPT_HTTPHEADER, array("If-Modified-Since: ".gmdate('D, d M Y H:i:s \G\M\T',time()+60*60*60*60)));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_FORBID_REUSE, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4);
curl_setopt($ch, CURLOPT_TIMEOUT, 4);

то есть. дата в будущем google.com возвращает;

HTTP/1.0 304 Not Modified
Date: Fri, 05 Feb 2010 16:11:54 GMT
Server: gws
X-XSS-Protection: 0
X-Cache: MISS from .
Via: 1.0 .:80 (squid)
Connection: close

и если я отправлю;

curl_setopt($ch, CURLOPT_HTTPHEADER, array("If-Modified-Since: ".gmdate('D, d M Y H:i:s \G\M\T',time()-60*60*60*60)));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_FORBID_REUSE, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4);
curl_setopt($ch, CURLOPT_TIMEOUT, 4);

то есть. дата в прошлом, google.com возвращает;

HTTP/1.0 200 OK
Date: Fri, 05 Feb 2010 16:09:12 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Server: gws
X-XSS-Protection: 0
X-Cache: MISS from .
Via: 1.0 .:80 (squid)
Connection: close

Если я затем отправлю оба файла bbc.co.uk(который его не поддерживает),

Возвращается будущий;

HTTP/1.1 200 OK
Date: Fri, 05 Feb 2010 16:12:51 GMT
Server: Apache
Set-Cookie: BBC-UID=84bb66bc648318e367bdca3ad1d48cf627005b54f090f211a2182074b4ed92c40ForbSoft%20Web%20Diagnostics%20%28URL%20Validator%29; expires=Tue, 04-Feb-14 16:12:51 GMT; path=/; domain=bbc.co.uk;
Accept-Ranges: bytes
Cache-Control: max-age=0
Expires: Fri, 05 Feb 2010 16:12:51 GMT
Pragma: no-cache
Content-Length: 111677
Content-Type: text/html

Возвращается дата в прошлом;

HTTP/1.1 200 OK
Date: Fri, 05 Feb 2010 16:14:01 GMT
Server: Apache
Set-Cookie: BBC-UID=841b66ec44232cd91e81e88a014a3c5e50ed4e20c0e07174c4ff59675cd2fa210ForbSoft%20Web%20Diagnostics%20%28URL%20Validator%29; expires=Tue, 04-Feb-14 16:14:01 GMT; path=/; domain=bbc.co.uk;
Accept-Ranges: bytes
Cache-Control: max-age=0
Expires: Fri, 05 Feb 2010 16:14:01 GMT
Pragma: no-cache
Content-Length: 111672
Content-Type: text/html

Итак, мой вопрос все еще стоит.

Ответ 1

Я провел некоторое тестирование на этом, и он работает следующим образом:

Если вы отправляете заголовок If-Modified-Since с датой, которая была в прошлом (5 минут до текущего времени должны это делать), тогда такие сайты, как google.com, w3.org, mattcutts.com, вернутся заголовок "HTTP/1.1 304 Not Modified" . Такие сайты, как yahoo.com, bbc.co.uk и stackoverflow.com, всегда возвращают "HTTP/1.1 200 OK".

Заголовок "Last-Modified" имеет нечего делать с "If-Modified-Since" , потому что вся точка отправки заголовка "HTTP/1.1 304 Not Modified" заключается в том, что вы не 'нужно отправить тело с ним (таким образом, сохраняя полосу пропускания, что является целым рядом с этим).

Поэтому ответ на мой вопрос заключается в том, что если сайт не возвращает заголовок "HTTP/1.1 304 Not Modified" при отправке заголовка "If-Modified-Since 5 mins ago", сайт не правильно запросите "If-Modified-Since" .

Если я ошибаюсь, скажите об этом и дайте показания для тестирования.

Изменить: Я забыл добавить, что хороший тест - сделать обычный запрос HEAD в домене (например, w3.org), взять дату "Last Modified" и затем сделать другой запрос с "If-Modified-Since" . Это проверит, что поддерживаются как "Last Modified" , так и "If-Modified-Since" . Обратите внимание: только потому, что сервер отправляет обратно дату "Last Modified" , это не значит, что он поддерживает "If-Modified-Since"

Ответ 2

Если объект возвращает заголовок "Last-Modified", он поддерживает его. Действительно имеет смысл.

Дополнительная информация: http://httpd.apache.org/docs/2.2/caching.html (Краткое руководство по условным запросам)

Очевидно, что только статические страницы/файлы будут иметь этот заголовок. С динамическим контентом (asp, php и т.д.) Невозможно узнать заголовки (если обработчики сайта не кэшируют вручную, например как это), и организация может или не может поддерживать If-Modified-Поскольку, по моему опыту.

Возможно, вы можете просто выполнить два запроса, за которым следует другой, отправив заголовок If-Modified-Since, а затем проверьте, является ли второй запрос 304 или 200.

EDIT-hurikhan77 указывает на важное замечание, и это, например, тестирование корня сайта для этой возможности, не гарантирует, что остальная часть сайта не поддерживает и не поддерживает это.

Ответ 3

относительно первого ответа выше. Я хотел бы отметить, что условные запросы имеют такой же смысл в динамическом контенте, как и на статическом контенте. Если код, генерирующий динамический контент, знает, что бэкэнд-объект (например, элемент базы данных) не изменился, он должен отправить 304 по условному запросу.

Jan

Ответ 4

Это отличный инструмент. На этой же странице есть и другие инструменты:

if-modified