2011-07-12 35 views
1

我在對請求重定向到不同主機之前對文件的響應代碼進行cURL檢查(以確保文件在我重定向之前存在)。PHP標頭 - 位置重定向似乎失去緩存

當我們都很開心的時候,我把它們從服務器發送到遠程主機,我們都很高興。

唯一的問題似乎是它不在用戶的機器上緩存。有什麼我可以做的,讓用戶瀏覽器知道這是同一個文件?我認爲它註定會知道,因爲它只是一個頭位置重定向(即標題(「位置:http://www.locationtogo.com/asda 242」!);

感謝所有幫助

- ------ UPDATE ----------

似乎對這個相當多的問題,所以讓我解釋一步一步...

  1. 用戶要求文件from handler.php
  2. handler.php進行cURL檢查以查看響應代碼是否爲
  3. 如果響應代碼是200,我重定向到文件
  4. 但每次重裝的handler.php相同的文件...這將重新加載整個文件

我現在已經意識到 - 愚蠢的錯誤 - 但會在這裏列出只是在任何人的體驗相同 - 我當然是尋找響應200,而不是200或304.

這是現在緩存。

+0

不知道我理解的問題是什麼。什麼是不緩存在哪裏,發生了什麼? –

+0

請重新閱讀您的問題。對我來說尤其是最後一部分不清楚。誰緩存什麼,什麼不是?什麼應該被緩存?什麼不應該被緩存?什麼是相同的(聽起來好像不一樣)? – hakre

+0

我現在已經整理了這個 - 這是我自己的錯誤。我希望這也能逐步清除。 – waxical

回答

-1

默認情況下,PHP和apache不會緩存PHP文件。我最近自己碰到了這個。但是,如果你願意,你可以返回一個304,這樣可以解決問題。我用etags做到了。

只需在瀏覽器第一次訪問etag散列時,首次發送瀏覽器。

header('Etag: '.$eTagHash); 

然後,檢查etag是否存在,如果是,請告訴瀏覽器它是未修改的304。

if(isset($_SERVER['HTTP_IF_NONE_MATCH'])) { 
    if(trim($_SERVER['HTTP_IF_NONE_MATCH']) == trim($eTagHash)){ 
     header("HTTP/1.1 304 Not Modified"); 
     exit; 
    }} 

您可以將$ eTagHash設置爲任何你想要的。你也應該在apache服務器上啓用etags(大多數情況下)。

如果您需要在其他地方重定向,只需更改etag散列,並且當它不匹配時,您可以使用新值再次向瀏覽器發送標頭etag。

+0

這適用於緩存腳本的輸出。不重定向。重定向需要302狀態碼。 –

+0

這假定他想發送一個302代碼。他解釋說文件沒有被緩存。對我來說,這聽起來像他正在使用HTML文件重定向不是頭。如果他使用頭緩存將永遠不會成爲一個問題,因爲服務器重定向是在響應頭中而不是在HTML體中,所以問題無論如何都是完全無效的。顯然他在問關於瀏覽器的「緩存」。 –

+0

他正在使用標題重定向,如問題所述「我認爲它本質上將知道它只是一個標題位置重定向(即標題('位置:http://www.locationtogo.com/asda?242');」 –

0

您需要添加一個Cache-ControlExpires標題以及重定向以表明它可以被緩存。

示例(這將讓瀏覽器緩存一個小時響應)

header('Cache-Control: max-age=3600') 
+1

PHP/Apache仍然不會緩存文件,除非你自己返回304. –

+0

PHP/Apache不需要(也不能)緩存該文件,瀏覽器被重定向到該位置並下載文件本身。/PHP將永遠不會讀取該文件(除非該文件被重定向到同一個服務器)。 –