2008-10-15 11 views

cevap

0

http yanıtı başlıklarını doğru şekilde kullanıyorsa, ancak genellikle gözden kaçmış olabilirsiniz. Aksi takdirde, içeriğin yerel bir md5-hash değerini saklamak sizin için yararlı olabilir (içeride daha kolay bir içerik dizgisi olmadıkça). İdeal değil (çünkü oldukça yavaş bir süreç) ama bu bir seçenek.

0

Evet, sayfaları zamanlanmamış olarak işaretlemek için HTTP üstbilgilerini kullanmalı ve kullanmalısınız. Dinamik olsalar da (PHP, ASPX, vb.) Ve/veya veritabanı tarafından yönlendirildiyse, Expires üstbilgisini/HTTP Modifiye Edilemeyi uygun bir şekilde göndermeyi manuel olarak denetlemeniz gerekir. ASP.NET'in bunun için bazı SqlDependency nesneleri vardır, ancak yine de yapılandırılması ve yönetilmesi gerekir. (Emin değilim PHP aynı bunun gibi bir şey var ama ARMUT şey muhtemelen orada eğer değil ... eğer)

1

Bu ETag başlığının tam amacı, ancak web çerçevesi veya desteklediği zorundadır Uygulamanızın Başlık, Eşleşmiyorsa ve If-Range (bkz. HTTP Ch 3.11) başlıklı isteklere uygun şekilde yanıt vermesi gerekir.

0

Last-Modified başlığı yalnızca sitenin programlayıcısının açıkça döndürülmesi için ayarlanmış olması durumunda kullanılacaktır.

Düzenli, statik bir sayfa için Last-Modified, HTML dosyasının son değişikliğinin zaman damgasıdır. Dinamik olarak oluşturulmuş bir sayfa için sunucu, isteğin yerine bağlı olarak içeriğin nasıl değiştiğini bilmenin gerçek bir yolu olmadığından, bir Last-Modified değerini güvenilir bir şekilde atayamaz. Bu nedenle, birçok sunucu üstbilgiyi hiç oluşturmaz.

Sayfa üzerinde denetime sahipseniz, Son Değiştirilen üstbilginin ayarlandığından emin olmak için Last-Modified numaralı denetimin başarılı olup olmadığını kontrol edin. Aksi takdirde, sayfayı getirmeniz ve değişen bir bölüm (ör. Haber sitesinin başlığında tarih/saat) bulmak için bir normal ifadeyi gerçekleştirmeniz gerekebilir. Böyle belirgin bir belirteç yoksa, sayfa içeriğinde bir MD5'in Oli's suggestion değerini değiştirdiğinden emin olmak için ikinci olarak kullanırdım.

2

bunu hep kullanışlı daha fazla olması Conditional GET Simon Willison makalesini buldum modası geçmiş olduğunu düşünebilirsin rağmen. Örnek PHP'de ancak diğer dillere uyarlayabileceğiniz kadar basit. İşte örneği: Bununla

function doConditionalGet($timestamp) { 
    // A PHP implementation of conditional get, see 
    // http://fishbowl.pastiche.org/archives/001132.html 
    $last_modified = substr(date('r', $timestamp), 0, -5).'GMT'; 
    $etag = '"'.md5($last_modified).'"'; 

    // Send the headers 
    header("Last-Modified: $last_modified"); 
    header("ETag: $etag"); 

    // See if the client has provided the required headers 
    $if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? 
     stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) : 
     false; 

    $if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? 
     stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : 
     false; 

    if (!$if_modified_since && !$if_none_match) { 
     return; 
    } 

    // At least one of the headers is there - check them 
    if ($if_none_match && $if_none_match != $etag) { 
     return; // etag is there but doesn't match 
    } 

    if ($if_modified_since && $if_modified_since != $last_modified) { 
     return; // if-modified-since is there but doesn't match 
    } 

    // Nothing has changed since their last request - serve a 304 and exit 
    header('HTTP/1.0 304 Not Modified'); 
    exit; 
} 

HTTP fiilleri kullanabilirsiniz GET veya HEAD (Ben others ile mümkündür düşünüyorum, ama bunları kullanmak için bir neden göremiyorum). Tek yapmanız gereken If-Modified-Since ya da If-None-Match ya da Last-Modified başlıklarının ya da sayfanın önceki bir sürümü tarafından gönderilen ETag değerlerinin eklenmesidir. HTTP sürüm 1.1'den itibaren Last-Modified üzerinden ETag önerilir, ancak her ikisi de işi yapacaktır.

Bu, koşullu bir GET'nin nasıl çalıştığıyla ilgili çok basit bir örnektir.Öncelikle sayfayı olağan şekilde almak gerekir:

GET /some-page.html HTTP/1.1 
Host: example.org
koşullu başlıkları ve içerikleri ile

İlk tepkisi: Artık

200 OK 
ETag: YourETagHere

koşullu olsun isteği:

GET /some-page.html HTTP/1.1 
Host: example.org 
If-None-Match: YourETagHere

Ve belirten tepkisi sayfanın önbelleğe alınmış sürümünü kullanabilirsiniz, çünkü sadece başlıklar teslim edilir:

304 Not Modified 
ETag: YourETagHere

Bu işlemle sunucu size bildirimde bulunmadı.

Ayrıca koşullu GET: HTTP conditional GET for RSS hackers ile ilgili başka bir makale de önerebilirim.

İlgili konular