"If-Modified-Since" için nasıl test

3 Cevap php

PHP kullanarak nasıl doğru test edebilirsiniz uzak bir web sitesi supports "If-Modified-Since" HTTP başlığının.

GET uzak dosya başlığı istekte belirtilen tarihten bu yana değiştirilmiş olup olmadığını ben ne okudum, - bu bir 200 OK durumunu dönmelidir. Modifiye edilmemiş ise, bu Modifiye değil 304 dönmelidir.

Dolayısıyla benim sorum, ne server doesn't desteği "yana-If-Modified" ama yine de bir 200 OK dönerse?

Web sitenizin destekleyip desteklemediğini kontrol edin orada bir kaç araç vardır "If-Modified-Since" bu yüzden ben nasıl çalıştıkları soruyorum sanırım.

Edit:

Ben şu göndererek, Curl kullanarak bazı testler gerçekleştirdik;

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);

gelecek google.com döner, yani bir tarih;

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

ve ben göndermek eğer;

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);

Geçmişte, yani bir tarih, google.com döner;

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

Sonra bbc.co.uk (ki bunu desteklemiyor) hem gönderirseniz;

Gelecekte bir döner;

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

Geçtiğimiz döner tarihi;

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

So my question still stands.

3 Cevap

Bu konuda bazı test gerçekleştirdik ve aşağıdaki gibi çalışması için görünür;

Eğer (bunu yapmalıyım şimdiki zaman önceki 5 dakika) Geçmişte olan bir tarih ile bir If-Modified-Since başlık göndermek sonra google.com gibi siteler, w3.org, mattcutts.com bir "HTTP dönecektir / 1.1 304 "başlığını Değişmedi. Yahoo.com, bbc.co.uk ve stackoverflow.com her zaman geri dönmek bir "HTTP/1.1 200 OK" gibi siteler.

"Last-Modified" başlığı nothing to do ile olan "If-Modified-Since" geri gönderme bütün mesele "HTTP/1.1 304 Değişmedi" çünkü başlık göndermek zorunda kalmamasıdır onunla vücut (böylece bant genişliği tasarrufu - Bu işin arkasında bütün mesele olan).

Bu nedenle, benim sorunun cevabı göndermek zaman bir site "HTTP/1.1 304 Not değiştirme" başlığını dönmezse eğer bir "If-Modified-Since 5 dakika önce" başlığının, site desteklemiyor olduğunu " If-Modified-Since düzgün bir istek ".

Ben yanlış isem, bunu söylemek ve göstermek için test veriniz.

Edit: Ben "Son Güncelleme" tarihini kapmak ve daha sonra "If-Modified-başka bir isteği yapmak, iyi bir test etki (örn. w3.org) normal bir HEAD isteği yapmak olduğunu eklemek unuttum beri ". Bu "Son Güncelleme" değer ve hem de "If-Modified-Since" isteği desteklenen olduğunu test edecek. Lütfen dikkat: sunucu "Son Güncelleme" tarihini geri gönderir o "If-Modified-Since" destekler anlamına gelmez çünkü

İşletme, "Last-Modified" başlığını dönerse, onu destekler. Gerçekten mantıklı.

Daha çok bilgi: http://httpd.apache.org/docs/2.2/caching.html (Şartlı İstekler için Özlü Kılavuz)

Açıkçası sadece statik sayfalar / dosyalar bu başlık olacak. Dinamik içerik (asp, php, vb) ile (site yükleyiciler, elle önbelleğe örneğin like this sürece), ve varlık ya da If-Modified-Since desteklemiyor olabilir başlıklarına göre bilmek yolu yoktur , benim deneyimlerinden.

Belki de sadece bir If-Modified-Since başlığını göndererek, iki istekleri, başka bir tarafından takip birini yapabilirsiniz, ve ikinci isteği bir 304 veya 200 ise daha sonra doğrulamak.

EDIT-hurikhan77 önemli bir not işaret, ve bu yeteneği için sitenin kök test örneğin, sitenin geri kalanı / doesn 't çok bu desteklemiyor garanti etmez, bu.

I Yukarıdaki ilk cevabı ilişkin statik içerik gibi koşullu istekler dinamik içerik kadar mantıklı olduğuna dikkat isterim. Dinamik içerik üretir kod backend varlık (örneğin veritabanı öğe) değişmediğini bilir eğer bir koşullu istek üzerine 304 göndermeniz gerekmektedir.

Ocak