2010-03-16 50 views
0

對不對,可能是錯誤的標題。我正在編寫一些代碼來處理If-Modified-Since和If-None-Match請求作爲緩存的一部分。除了PHP在標題之後返回一些內容(空行)之外,一切都很完美。頁面內容應該是空的。我使用的代碼是:304未修改問題

<?php 
$lastmod = filemtime($f); 
$etag = '"'.dechex($lastmod).'"'; 
if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == $last_mod || $_SERVER['HTTP_IF_NONE_MATCH'] == $etag) { 
    header('HTTP/1.1 304 Not Modified'); 
    header('Content-Length: 0'); 
    exit(); 
} 
?> 
+0

你的代碼沒有經過。重新連接? – mattbasta 2010-03-16 03:18:41

+0

此處的錯誤:http://redbot.org/?uri=http%3A%2F%2Fameer1234567890.co.cc%2Ftest%2Ftest.php – Ameer 2010-03-16 03:41:27

+0

不會在304響應中添加Content-Length標頭(參考RFC 2616 sec 4.3 ) – Hafthor 2011-06-16 22:57:35

回答

1

終於解決了這個bug。 Gzip是罪魁禍首。由於我正在對If-Modified-Since和If-None-Match請求進行gzip響應,因此gzip向響應添加了幾個字節(一種gzip標頭)。現在我已經停止了對If-Modified-Since和If-None-Match請求的gzip響應,並且它就像一個魅力一樣。

0

試試這個代碼:

$last_modified = filemtime($f); 
if(isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])) { 
    $expected_modified = strtotime(preg_replace('/;.*$/','',$_SERVER["HTTP_IF_MODIFIED_SINCE"])); 
    if($last_modified <= $expected_modified) { 
     header("HTTP/1.0 304 Not Modified"); 
     exit; 
    } 
} 
+0

我的問題不在於檢測或返回適當的標頭,而只是在標頭之後由php輸出的空行。 – Ameer 2010-03-16 03:30:36

+0

錯誤在這裏:http://redbot.org/?uri=http%3A%2F%2Fameer1234567890.co.cc%2Ftest%2Ftest.php – Ameer 2010-03-16 03:40:20

+0

你有'register_shudown_function'集? – mattbasta 2010-03-17 12:06:07

0

我找到了解決辦法在Answering HTTP_IF_MODIFIED_SINCE and HTTP_IF_NONE_MATCH in PHP

創建新的文件caching_headers.php

<?php 
function caching_headers($file,$timestamp){ 
    $gmt_mtime=gmdate('r', $timestamp); 
    header('ETag: "'.md5($timestamp.$file).'"'); 
    if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])||isset($_SERVER['HTTP_IF_NONE_MATCH'])){ 
     if ($_SERVER['HTTP_IF_MODIFIED_SINCE']==$gmt_mtime||str_replace('"','',stripslashes($_SERVER['HTTP_IF_NONE_MATCH']))==md5($timestamp.$file)){ 
      header('HTTP/1.1 304 Not Modified'); 
      exit(); 
     } 
    } 
    header('Last-Modified: '.$gmt_mtime); 
    header('Cache-Control: public'); 
} 
?> 

和在你想要緩存的所有php文件中加入:

<?php 
include('caching_headers.php'); 
caching_headers($_SERVER['SCRIPT_FILENAME'],filemtime($_SERVER['SCRIPT_FILENAME'])); 
?> 
+0

正如我上面提到的,我的問題不在於檢測或返回適當的頭文件,而只是在頭文件後由php輸出的空行。 – Ameer 2011-02-18 05:26:14

+0

@Ameer - 可能使用'exit;'而不是'exit();'。 – Binyamin 2011-02-18 09:53:35

+0

這也行不通。 – Ameer 2011-03-05 00:41:37