браузеры (проверены librewolf и chromium) не будут отправлять, если они были изменены с тех пор, и если ни одно совпадение не соответствует после получения одного ответа 304 не изменено

локальный сервер разработки:

      Server : Apache/2.4.46 (Unix) OpenSSL/1.1.1j PHP/8.0.3 mod_perl/2.0.11 Perl/v5.32.1

Я отправляю etag и заголовки последних измененных ответов с помощью php:

        "Connection    : close"
  "Content-Type  : text/html; charset=UTF-8"
  "Date          : ".gmdate("D, d M Y H:i:s")." GMT";
  "Last-Modified : ".$lastmod;
  "Etag          : ".$etag;
  "Expires       : 1" //can't have the browser doesn't check if file was modified on server
  "Pragma        : public"
  "Cache-Control : max-age=1,must-revalidate"

ob_start("ob_gzhandler")отправляет

       "Content-Encoding : gzip"

Апач отправляет:

       "Connection        : Keep-Alive"
 "Keep-Alive        : timeout=5, max=99"
 "Server            : Apache/2.4.46 (Unix) OpenSSL/1.1.1j PHP/8.0.3 mod_perl/2.0.11 Perl/v5.32.1"
 "Transfer-Encoding : chunked"
 "Vary              : Accept-Encoding"
 "X-Powered-By      : PHP/8.0.3"

Когда клиент снова запрашивает ту же страницу, я ловлю с помощью php, если ни одно совпадение и если оно изменено, поскольку заголовки запроса и могут отправить ответ 304 без изменений.

      if (
((isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) 
  &&  $_SERVER['HTTP_IF_MODIFIED_SINCE'] == $lastmod )
|| 
(!isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) 
&& isset($_SERVER['HTTP_IF_NONE_MATCH'])
&& trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag)
)
)
{

   header("HTTP/1.1 304 Not Modified");
   header("Content-Length:0");
   header('Etag:'. $etag);
   header('Last-Modified:'.$lastmod);

   exit;

 } 

Однако при последующем запросе той же страницы клиент не отправляет заголовки запроса if none match и if Modified, и страница перезагружается.

Как указано в этом сообщении блога http://edn.embarcadero.com/article/38123 (однако насчет asp), я также отправляю тот же etag и не измененные заголовки с 304 (+ acontent-length : 0заголовок ответа).

Но это не помогает, все равно нет, если изменить, поскольку в третьем запросе

Что я могу сделать, чтобы сообщить клиенту, чтобы он всегда, а не один раз, отправлял заголовки запроса if none match и/или if изменить его?

0 ответов

Другие вопросы по тегам