2009-12-21 106 views
9

的東西,我認爲Apache,將這些HTTP報頭由PHP腳本生成的所有響應:PHP刪除HTTP標頭

Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

該工程確定爲實際動態頁面,但我認爲,雖然產生了一些頁面PHP,大多是靜態的,我希望瀏覽器緩存它們。

有沒有辦法在PHP中從響應中刪除這些標題,從而激活瀏覽器的默認緩存規則,或者,如果沒有,是否有任何價值,我可以將它們設置爲相當於他們缺席?

我不想設置自己的值,因爲我希望瀏覽器使用與Apache本身提供的靜態資源(不使用mod_cache)相同的緩存規則。

回答

2

首先我會檢查它是否真的不是設置這些頭文件的php腳本之一。

register_shutdown_function('foo'); 
echo "test"; 

function foo() { 
    flush(); 
    $c = "headers_list: \n " . join("\n ", headers_list()); 

    if (function_exists('apache_response_headers')) { 
    $c .= "\napache_response_headers:"; 
    foreach(apache_response_headers() as $k=>$v) { 
     $c.= "\n $k=$v"; 
    } 
    } 
    $c .= "\n\n"; 
    echo '<pre>', $c, '</pre>'; 
} 

這是否打印的東西「可用」您的服務器上?

+1

我已經完成了研究,看起來PHP在使用會話函數時設置了標題。有些方法可以改變標題的值,但不能阻止它們被設置。 –

+2

其實,將session.cache_limit設置爲「none」(無證的值)可以解決它。參見http://stackoverflow.com/questions/681115/cache-control-header-modified-by-php-session –

+0

哇,我不會想到那麼久了;-) – VolkerK

2

您可以通過函數header()從PHP手動提供HTTP頭。

我想象這樣做應該禁用Web服務器的默認標題值。

+0

如果我將它們設置爲空字符串,例如「Cache-Control:」,瀏覽器是否會以與缺少時相同的方式來解釋? –

+0

你確定PHP不只是添加標題行,而是會生成全新的標題? – dusoft

+0

默認行爲是用相同的名稱替換現有的頭文件,如頭文件中所示() –

7

對於那些特定的文件,你可以添加header()調用來設置不同的標題。即。 header("Expires: " . $currentDatePlus10);

header("Cache-Control: max-age=3600, must-revalidate") 
+0

如果可能,我真的想完全刪除頭文件,以便瀏覽器行爲與普通靜態文件完全相同在未配置的服務器上。 –

+0

由於它發生在PHP環境之外,缺乏在Apache中進行挖掘,因此用其他值覆蓋將是您最好的選擇。我通常會對靜態內容使用荒謬的過期日期(閱讀10年)來保持內容緩存。 – Myles

+1

我擔心如果將其設置爲將來10年的日期,則更改實際上不會被用戶接收。 –

1
header("Expires: Fri, 1 Jan 2038 05:00:00 GMT"); 

或在遙遠的未來的一些同樣荒謬的時間。請記住,在發送任何輸出之前設置標題值,除非您要爲整個頁面進行輸出緩衝。

http://php.net/manual/en/function.header.php

0

抑制高速緩存,可製成如下: PHP代碼:

header ("Cache-Control: no-cache, must-revalidate");// HTTP/1.1 
header ("Expires: Mon, 1 Jul 1990 05:00:00 GMT");// Date in the past 
如果你想自動生成它

,那麼你這個位置:PHP:session_cache_limiter() - 手動他們

+0

這正是我試圖阻止 –

+0

很抱歉,但你沒有訪問瀏覽器緩存卷,所以你必須使用http://at.php.net/manual/de/function.session-cache- expire.php – streetparade

-1

我還沒有試過這個,但是你可能會把這樣的頁面保存爲.html文件與你自定義的頭文件或者缺少它們,腳本可以在

0

您的代碼中可能存在設置這些變量的地方,因爲我無法找到它們由PHP自動插入的位置,也不在我的任何LAMP安裝中。

我安裝的唯一自動生成的頭文件是X-Powered-By與PHP版本。

正如你所說的,他們建議用header("Expires:");代替舊的標題,但在我的瀏覽器中header("Cache-control:");剛成爲Cache-Control: max-age=0(所以這不是你要做的)。

我建議檢查這些值是否來自框架或已更改的設置,但它可能會在您運行PHP的不同版本的PHP /平臺上有所不同。

我會檢查ExpiresByTypeExpiresDefault在全局配置,虛擬主機,公關指令。htaccess的文件或包裹在<IfModule mod_expires><IfModule mod_expires.c>

任何塊「我希望瀏覽器使用相同的緩存規則,作爲由阿帕奇本身提供服務(不使用mod_cache的)靜態資源。」

嘗試查看靜態資源,然後匹配規則。你可以用這個計算Expires offest - >http://www.php.net/manual/en/function.header.php#93377

+0

我確定頭文件不是在PHP中設置的。 @「試着看一下靜態資源,然後再匹配規則。」:就是這一點,他們沒有這些標題;) –

+0

讓我爲你做這個更簡單, 「有沒有我可以設置它們的任何值這相當於他們缺席?「 不是真的。(空白)將各瀏覽器interpretted。 ‘我不希望把我自己的價值觀’ 這是不可能的,因爲你或你的主機已經有地方。 –

+0

好吧,我是一定的頭文件不是由我的代碼設置的,顯然,當你使用它的會話時,它們是由PHP設置的。查看我的評論@VolkerK –

1

當你開始使用會話和這些緩存頭被送到設置爲「非緩存」由默認;這確保了每個請求都能得到一致的結果。例如,如果您有一個購物車系統並且您的瀏覽器緩存/add?product=xyz,它可能不會再次添加該產品;如果您有一個購物車系統並且您的瀏覽器緩存/add?product=xyz,這可能不是你想要的。

話雖如此,默認設置可以通過使用session_cache_limiter()之前session_start()或設置相應session.cache_limiter配置設置來改變。