2012-07-18 58 views
0

我已經保存在我的web服務器的根目錄下面簡單的PHP頁面一個非常奇怪的問題,因爲test.php:當頁面被加載Safari 5.1.7從內容到頁面混合標題?

<? 
if($_GET['img']) { 
    header('HTTP/1.0 304 Not Modified'); 
    die(); 
} else { 
    header("Cache-Control: no-store, no-cache, must-revalidate"); 
} 
?> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<body> 

<img src="/test.php?img=1"> 
<a href="/not_existent_page.php">Dead link</a> 

</body> 
</html> 

所以,我的服務器響應與以下標題:

Status Code 200 
Cache-Control no-store, no-cache, must-revalidate 
Content-Type text/html; charset=utf-8 
Date Wed, 18 Jul 2012 12:00:43 GMT 
Server Apache/2.2.22 (Ubuntu) 
Strict-Transport-Security max-age=172800, includeSubDomains 
Vary Accept-Encoding 
x-frame-options sameorigin 
x-powered-by PHP/5.4.4-1~precise+1 
x-ua-compatible IE=edge 

有趣的部分是緩存標題:它說,不要緩存!

加載頁面後的圖片請求具有以下響應頭:

Status Code 304 
Date Wed, 18 Jul 2012 12:02:20 GMT 
Server Apache/2.2.22 (Ubuntu) 

這並不是說有關緩存任何東西(但不要緊,反正我測試了它)。

使用firefox和chrome站點的行爲應該是這樣的:每次我重新加載頁面時,它都會被重新加載。如果我點擊鏈接,我會得到一個404 apache錯誤。

Safari瀏覽器,會發生以下情況:

如果我第一次打開網頁,我看到了。 當我在短時間內重新加載頁面(請參閱下面的短時間意味着什麼)它總是給我一個空白的網站,當我點擊和它的死鏈接有時給我一個空白的網站,但我看到safari的Web開發者控制檯中的以下標題:

Status Code 304 
Connection:Keep-Alive 
Date:Wed, 18 Jul 2012 12:07:41 GMT 
Keep-Alive:timeout=15, max=99 
Server:Apache/2.2.22 (Ubuntu) 
Vary:Accept-Encoding 

頁面保持空白!但是:在我的Apache服務器日誌,它說,它返回的所有良好的狀態代碼:200上重新加載頁面:(和點擊死鏈接時,404)

// first page load 
[18/Jul/2012:14:10:12 +0200] "GET /test.php HTTP/1.1" 200 979 "url/test.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2" 

// request of picture with answer 304 
[18/Jul/2012:14:10:12 +0200] "GET /test.php?img=1 HTTP/1.1" 304 266 "url/test.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2" 

// reload within 10 seconds 
[18/Jul/2012:14:10:19 +0200] "GET /test.php HTTP/1.1" 200 777 "url/test.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2" 

而現在到了有趣的部分:如果我等待約。加載頁面後10秒以上,Safari的行爲如預期的那樣:它只是在沒有304頭的情況下重新加載頁面(或者在死鏈接上顯示404)。

我對Firefox和Chrome都沒有問題。

所以我的問題:Safari瀏覽器混合了頁面的標題,但只有當再次加載頁面/在10秒內點擊鏈接?我怎樣才能防止這一點?這是在safari中的錯誤?

順便說一句:如果我將頭部改爲別的東西,Safari會緩存該頭部。所以,如果我改變test.php的是這樣的:

... 
if($_GET['img']) { 
    header('HTTP/1.0 204 No Content'); 
    die(); 
} else { 
.... 

的頁面重載現在乾脆中止沒有做任何事情,但我頭在Safari控制檯中看到的是204 No Content

最後一件事:在10秒內重新加載頁面不斷觸發錯誤,而有時點擊鏈接在safari中工作,有時不會。

回答

2

/測試。PHP將永遠設置header("Cache-Control: no-store, no-cache, must-revalidate");沒有什麼有趣的頭說do not cache,因爲你明確地設置這些頭。

/test.php?img=whatever不會像上面那樣設置Cache-Control標題並且總是返回空白304 Not Modified。您正在退出header()調用之後。從技術上講,這不是一個圖像到Apache。它的MIME類型將是文本/ HTML,因此它會將您的過期/緩存作爲HTML和PHP(在.conf和/或htaccess中)。除非你做header('Content-Type: image/jpeg', true);或類似的。

在某些情況下,使用header()的第二個參數替換以前的參數也是很好的做法。

試試這個。讓我知道如果你得到相同的結果

<?php 
if (isset($_GET['img'])) { 
    header('Content-Type: image/jpeg', true); 
    header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified', true, 304); 
    exit; 
} else { 
    header('Expires: -1', true); 
    header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0', true); 
} 
?> 
+0

固定它的是'Content-Type:image/jpeg'。我不知道爲什麼只有safari 5.1.7才需要這個功能,看起來它不能處理缺少的Content-Type標頭並將其混合起來。因爲我的服務器從未爲'304'請求發送任何'Content-Type'(我發佈了回到我的問題中的唯一頭文件)。 Safari 6已經修復了這個順便說一句。 – Markus 2012-08-19 19:28:19