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