Как проверить поддержку HTTP-заголовка If-Modified-Since - PullRequest
11 голосов
/ 05 февраля 2010

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

Из того, что я прочитал, если удаленный файл, который вы ПОЛУЧАЕТЕ, был изменен с даты, указанной в запросе заголовка - он должен вернуть статус 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

Так что мой вопрос остается в силе.

Ответы [ 3 ]

7 голосов
/ 08 февраля 2010

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

Если вы отправите заголовок 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 минут назад», сайт не правильно поддерживает запрос «If-Modified-Since».

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

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

5 голосов
/ 05 февраля 2010

Если объект возвращает заголовок «Last-Modified», то он поддерживает его. Имеет смысл на самом деле.

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

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

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

РЕДАКТИРОВАТЬ - hurikhan77 указывает на важное замечание, и это то, что, например, тестирование корня сайта для этой возможности, не гарантирует, что остальная часть сайта поддерживает / не поддерживает это тоже.

1 голос
/ 09 февраля 2010

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

Jan

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...