PHP HTTP_IF_MODIFIED_SINCE ve HTTP_IF_NONE_MATCH Yanıtlama

6 Cevap php

PHP 5.1.0 + yapılan önbelleklenebilecek dinamik içeriğe sahip. Zaten müşterilerine (Son-Modifiye ve ETag'a dahil) doğru başlıklarını gönderin.

Ben şimdi ['HTTP_IF_MODIFIED_SINCE'] benim senaryom $ _SERVER cevap verebilmek istiyorum ve $ _SERVER ['HTTP_IF_NONE_MATCH'] mevcut olduğunda. Koşulları eşleştiği zaman, ben müşterilere "Değişmedi" bir HTTP 304 cevaplamak istiyorum.

Doğru koşullar nelerdir? Tam olarak ne zaman yerine bütün içeriği bir 304 sorunu?

The accepted answer in question http://stackoverflow.com/questions/4506/http-how-to-know-when-to-send-a-304-not-modified-response seems to issue this correctly but I have hard times to port that code to PHP 5.

Teşekkür ederiz!

6 Cevap

Ben hep kullandım:

function caching_headers ($file, $timestamp) {
    $gmt_mtime = gmdate('r', $timestamp);
    header('ETag: "'.md5($timestamp.$file).'"');
    header('Last-Modified: '.$gmt_mtime);
    header('Cache-Control: public');

    if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) || isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
        if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == $gmt_mtime || str_replace('"', '', stripslashes($_SERVER['HTTP_IF_NONE_MATCH'])) == md5($timestamp.$file)) {
            header('HTTP/1.1 304 Not Modified');
            exit();
        }
    }
}

Ben yazdım veya başka bir yerden aldım mı hatırlamıyorum ...

Ben normalde bu şekilde bir dosyanın en başında kullanıyorum:

caching_headers ($_SERVER['SCRIPT_FILENAME'], filemtime($_SERVER['SCRIPT_FILENAME']));

Eğer baþvurduðunuzu cevabı tüm ihtiyacınız içeren görünüyor. Özetlemek gerekirse:

  • Eğer bütün vücudu gönderme olurdu, sanki sadece kendi ETag ve Last-Modified başlıkları oluşturmak
  • If-Modified-Since başlığının son değiştirilmiş kendi eski veya aynı ise gönderilen istemci göndermek 304 bakmak
  • Eğer maç istemci If-None-Match başlığına bakarsanız, kendi ETag 304 göndermek
  • Burası ulaşması halinde, başlıkları komple vücut ve yeni ETag'a / Son-Modifiye başlıkları göndermek eşleşmiyor

İşte benim render_file () işlevi, bir parçacık olduğunu.

$last_modified = filemtime($filename);
if ($last_modified === false) {
  throw new Exception('Modify date unknown');
}
if (array_key_exists('HTTP_IF_MODIFIED_SINCE', $_SERVER)) {
  $if_modified_since = strtotime(preg_replace('/;.*$/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE']));
  if ($if_modified_since >= $last_modified) { // Is the Cached version the most recent?
    header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified');
    exit();
  }
}
header('Last-Modified: '.date('r', $last_modified)); // tz should be GMT according to specs but also works with other tzs

// other headers and contents go here  

If the client has performed a conditional GET request and access is allowed, but the document has not been modified, the server SHOULD respond with this status code. The 304 response MUST NOT contain a message-body, and thus is always terminated by the first empty line after the header fields.

Gönderen - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5

Eğer 304 gönderirseniz Yani, vücut göndermek yok.

This article önbelleğe tüm sorulara cevap verecektir

Ben bulduğunu da ekledi

RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}]
RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}]

(Tüm RewriteRule aşağıda) benim htaccess dosyasının altına çalıştı.

Neden?

Ben koşullu istekler aslında bir site yavaşlatmak bulundu konuda çok araştırma yapmış olan. Bu durum değil, genel kullanım alışkanlıklarına haritalama genel olarak daha düşük verim ve daha az etkili önbelleğe alma ile sonuçlanır bazı senaryolar vardır.

C.