2012-09-02 50 views
3

我已經通過了超過100個答案在這裏,很多嘗試,沒有工作??PHP高速緩存頭覆蓋

有一個基於PHP的網站。我需要緩存關閉所有.php文件EXCEPT A SELECT FEW。

所以,在.htaccess中,我有以下幾點:

ExpiresActive On 
# Eliminate caching for certain dynamic files 
<FilesMatch "\.(php|cgi|pl)$"> 
ExpiresDefault A0 
Header set Cache-Control "no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, no-transform" 
Header set Pragma "no-cache" 
</FilesMatch> 

用Firebug,我看到以下內容:

Cache-Control no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, no-transform 
Connection Keep-Alive 
Content-Type text/html 
Date Sun, 02 Sep 2012 19:22:27 GMT 
Expires Sun, 02 Sep 2012 19:22:27 GMT 
Keep-Alive timeout=3, max=100 
Pragma no-cache 
Server Apache 
Transfer-Encoding chunked 
X-Powered-By PHP/5.2.17 

嘿,看起來不錯!

但是,我有一個.php頁面,我需要一些非常短暫的緩存。

我認爲簡單的答案是有這個加到我想每個緩存PHP頁面的最頂端啓用:

<?php header("Cache-Control: max-age=360"); ?> 

都能跟得上。

然後我嘗試了上面的各種版本。不。

然後我嘗試meta http-equiv版本。不。

然後我試圖htaccess的代碼的變化與上述的變化一起,例如將其限制到:

# Eliminate caching for certain dynamic files 
<FilesMatch "\.(php|cgi|pl)$"> 
Header set Cache-Control "no-cache, max-age=0" 
</FilesMatch> 

不。

我似乎沒有做任何事情可以允許一個.php文件啓用緩存,而.htaccess代碼已經啓用,完全沒有從.htaccess文件中刪除語句。

我哪裏錯了?我必須做些什麼才能讓單個PHP頁面可以緩存而其餘的頁面仍然可用?

謝謝你的任何想法。

+0

只需再添加一個FilesMatch節來匹配需要緩存的文件? – meze

+0

嗨,謝謝 - 我正在考慮類似的東西,但需要打開的緩存文件是從模板中動態生成的,並且可以自由命名 - 所以我將頭添加到模板本身。我想我可以嘗試強制名稱前置或某物並嘗試通配符 - 但似乎我不應該去那個極端? – Soyo

回答

2

好吧,顯然這沒有答案。所以,我現在的解決方案是完全消除.htaccess代碼,併爲每個文件應用顯式標題。你所知道的痛苦是什麼,但是現在是時候繼續前進了。如果任何人有一個更優雅的解決方案,可以與一個.htaccess的默認工作,請隨時分享...謝謝

1

所以我知道我遲到..也許爲時已晚。但我遇到了一個類似的問題,我想我會分享我的解決方案。

基本上,我爲每個我不希望被緩存的文件(或者具有與我的靜態資源不同的緩存時間)關閉了ExpiresActive Off。它看起來是這樣的:

ExpiresActive On 

<FilesMatch "\.(php|cgi|pl)$"> 

    # This makes sure that no cache headers can be set, 
    # but does not generate an error when trying to. 
    ExpiresActive Off 

</FilesMatch> 

# Your normal caching here 
ExpiresDefault "access plus 1 month" 

現在,在你的PHP腳本結束後,你應該能夠插入緩存頭沒有他們,你的.htaccess文件被覆蓋,就像你在做

<?php header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 360) . ' GMT'); ?> 

希望這是有幫助的。

1

這個答案對我有解決方案:https://stackoverflow.com/a/4521120/2685496

我一點也不知道,session_start();默認情況下,將覆蓋Cache-Control和Expires頭與值,以確保該頁面不被緩存。

您可以在session_start();之前使用session_cache_limiter('public');,就像Marcin建議的那樣,或者您可以在session_start();之後使用header();陳述。