Как протестировать на поддержку HTTP-заголовка “If-Modified-Since”

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

Из того, что я читал, если удаленный файл, который Вы ПОЛУЧАЕТЕ, был изменен, так как дата указала в запросе заголовка - это должно возвратить 200 состояний OK. Если это не было изменено, это должно возвратить 304, Не Измененные.

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

Существует несколько инструментов там, что проверка, если Ваш веб-сайт поддерживает "If-Modified-Since", таким образом, я предполагаю, что спрашиваю, как они работают.

Править:

Я выполнил некоторое тестирование с помощью Завихрения, отправив следующее;

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

Таким образом, мой вопрос все еще стоит.

11
задан J.C 8 February 2010 в 11:42
поделиться

3 ответа

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

Если вы отправите заголовок 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" должным образом.

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

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

.
7
ответ дан 3 December 2019 в 08:55
поделиться

Как насчет:

defaultPort = (new Random()).Next(48620, 49150);
-121--981921-

После многих споров (и разумного комментария Маттье М. и виллинтехаспама) я изменю свое предложение на

v1.insert( v1.end(), v2.begin(), v2.end() );

Я сохраню прежнее предложение здесь:

v1.reserve( v1.size() + v2.size() ); 
v1.insert( v1.end(), v2.begin(), v2.end() );

Есть некоторые причины сделать это последним способом, хотя ни один из них не является достаточно сильным:

  • нет никакой гарантии относительно того, какой размер будет перераспределен вектору - например, если размер суммы равен 1025, он может быть перераспределен до 2048 - в зависимости от реализации. Такой гарантии для резерва тоже нет, но для конкретного осуществления это может быть правдой. Если охота на узкое место может быть разумным проверить это.
  • reserve заявляет, что наши намерения ясны - оптимизация может быть более эффективной в этом случае (резерв может подготовить кэш в некоторой первоклассной реализации).
  • также, с резервом у нас есть стандартная гарантия C++, что будет только одно перераспределение, в то время как вставка может быть реализована неэффективно и сделать несколько перераспределений (также что-то проверить с конкретной реализацией).
-121--1085399-

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

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

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

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

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

5
ответ дан 3 December 2019 в 08:55
поделиться

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

Янв

1
ответ дан 3 December 2019 в 08:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: