PHP HTTP Koşullu alın cevaplar benim uygulaması Tamam mı?

1 Cevap php

, Bir çok arama buldum her öğreticiler okuma ve burada bazı sorular sorduktan sonra, ben nihayet (en azından bence) corrctly cevaplamak için başardınız hiçbiri-maç-eğer ve değişiklikte-beri HTTP istekleri.

Hızlı bir özetleyelim yapmak için, bu ben önbelleklenebilecek every sayfalarında ne olduğunu:

session_cache_limiter('public'); //Cache on clients and proxies
session_cache_expire(180); //3 hours
header('Content-Type: ' . $documentMimeType . '; charset=' . $charset);
header('ETag: "' . $eTag . '"'); //$eTag is a MD5 of $currentLanguage + $lastModified
if ($isXML)
    header('Vary: Accept'); //$documentMimeType can be either application/xhtml+xml or text/html for XHTML (based on $_SERVER['HTTP_ACCEPT'])
header('Last-Modified: ' . $lastModified);
header('Content-Language: ' . $currentLanguage);

Ayrıca, her sayfa (her dil için) o kendi URL var. Örneğin, "index.php" URL İngilizce "/ tr / home" ve Fransızca "/ fr / accueil" altında sunulacaktır.

Benim büyük sorun için "304 Değişmedi" cevap oldu none-maç-eğer ve değişiklikte-beri HTTP istekleri only when needed.

The best doc I've found is: http://rithiur.anthd.com/tutorials/conditionalget.php

Ve bu ben (bu kod parçası önbelleğe alınabilir sayfalarda EE denir) bunun yaptığı uygulamasıdır:

$ifNoneMatch = array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER) ? $_SERVER['HTTP_IF_NONE_MATCH'] : false;
$ifModifiedSince = array_key_exists('HTTP_IF_MODIFIED_SINCE', $_SERVER) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false;

if ($ifNoneMatch !== false && $ifModifiedSince !== false)
{
    //Both if-none-match and if-modified-since were received.
    //They must match the document values in order to send a HTTP 304 answer.
    if ($ifNoneMatch == $eTag && $ifModifiedSince == $lastModified)
    {
        header('Not Modified', true, 304);
        exit();
    }
}
else
{
    //Only one header received, it it match the document value, send a HTTP 304 answer.
    if (($ifNoneMatch !== false && $ifNoneMatch == $eTag) || ($ifModifiedSince !== false && $ifModifiedSince == $lastModified))
    {
        header('Not Modified', true, 304);
        exit();
    }
}

Benim soru iki yönlüdür:

  • Bunu yapmak için doğru yolu nedir? Ben none-maç-eğer ve değişiklikte-beri gönderilir, both Bir 304 cevap eşleşmesi gerekir zaman demek ve iki biri gönderilecektir yalnızca, sadece bu bir eşleşen bir göndermek için OK 304?
  • Burada anlatılan bağlamında kullanıldığında, bu 2 parçacıkları (I vekiller and Web tarayıcıları dost önbelleğe demek) dostu kamu önbellek olmasıdır?

BTW, ben 5.1.0 + sadece PHP kullanabilirsiniz (ben sürümlerini desteklemez düşük o).

Edit: lütuf eklendi ... Ben kaliteli bir cevap bekliyoruz. Eğer bir şey tahmin ediyorsanız / oy cevap vermeyin!

1 Cevap

  • Bu çok doğru değil. alt text: algoritma bir göz atın lütfen
  • Çözelti vekil-dostu, sen Cache-denetim kullanabilirsiniz: Eğer bir kaynak hakkında onlara herhangi bir tazelik bilgi itaat önbelleklerini zorlamak için vekil-REVALIDATE (sadece paylaşılan uygulanır | vekil önbelleğe)

İşte size yardımcı olabilecek fonksiyonudur:

function isModified($mtime, $etag) {
    return !( (
        isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
        && 
        strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $mtime
    ) || (
        isset($_SERVER['HTTP_IF_NONE_MATCH'])
        && 
        $_SERVER['HTTP_IF_NONE_MATCH'] == $etag
    ) ) ;
}

http://www.peej.co.uk/articles/http-caching.html: Ben aşağıdaki yazımıza bir göz atın öneririz

Update:

[AlexV] almak bile mümkün mıdır yok-maç-eğer VE değişiklikte-beri aynı anda?

Kesinlikle seti hem de sahip olabilir. Ancak;

Işletmenin hiçbiri maç etiketleri varsa, If-None-Match başlığı alan yokmuş gibi o sunucu istenen yöntemini gerçekleştirmek OLABİLİR, ama aynı zamanda göz ardı ZORUNLU Varsa-Modified-Since başlık alan (lar) isteği. Yani hiçbir varlık etiketleri maç varsa, o zaman sunucu bir 304 (Değişmedi) yanıt dönmek, olmamalıdır.

RFC2616 #14.26

Örnek değerler (W 'zayıf' anlamına gelir; daha oku RFC2616 #13.3.3):

If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
If-None-Match: *

Özel bir durum olarak, değer "*" kaynak herhangi bir cari varlık eşleşir.