最近遇到個比較古怪的問題:當頁面巢狀多個 Iframe 時會出現 Iframe 裡包含的頁面無法看到最新的頁面資訊。

初步解決方案,在 Iframe 指向的頁面地址字尾新增一個隨機數或者時間戳。這樣能確保每次在載入頁面時,讓瀏覽器知道它是最新的頁面。說白了就是欺騙下瀏覽器,躲過快取的災難。(這是從 Stack Overflow 和 CSDN 上找到一個看似可行,能徹底治根的辦法。 )

Sample Code:

通過 JS 產生隨機數,把資料數當成引數傳給頁面地址

<script type="text/javascript">
var randomnumber=Math.floor(Math.random()*100000);
document.write('<iframe src="xxxx.aspx?_='+randomnumber+'"></iframe>');
</script>

通過時間戳的辦法

<script>
var ts=new Date().getTime()
document.write('<iframe src="xxxx.asp?_='+ts+'"></iframe>');
document.write('<iframe src="xxxxxx.asp?_='+ts+'"></iframe>');
document.write('<iframe src="xxxxxxxx.asp?_='+ts+'"></iframe>');
</script>

但這樣現象依舊,實在快崩潰了。我依舊沿著這個方向去找,畢竟 Iframe 產生快取是根源。既然瀏覽器端用這種方式依舊無法解決。只好從伺服器端下手了,突然靈光一現,IIS 貌似有個可以自動保留快取的機制。

看來距離徹底治根的辦法不遠了。開始進入測試環境的 VM 機,把 IIS 給開起來,一開始有個配置項就吸引我了。 “HTTP 響應標頭”, 因為最最最早在處理這個辦法的時候就是利用 JS 來強制清除瀏覽器快取(可以參考如下,雖然這個辦法沒根治,但應該有需要這個方法的碼友)。

<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT= "no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT= "Wed, 26 Feb 1997 08:21:57 GMT">

開始配置 HTPP 響應標頭。

1. 進入 IIS ,找到傳說中的 “ HTTP 響應標頭”,進入 HTTP 響應標頭

2.新增自定義 HTTP 響應標頭

問題終於得到解決..