2015-09-01 50 views
-1

原諒我以前的努力來解釋問題。這是我在這裏的第一篇文章,我需要一些縮小實際問題的練習。當我瀏覽到包含此代碼出現Submit按鈕的頁面:我已經剝奪了一些PHP代碼來演示該問題:PHP代碼複製nocache = 1功能

<?php 
session_start(); 
$message = ""; 
if($_SERVER['REQUEST_METHOD'] === 'POST') { 
    if(empty($_SESSION['token1'])) { 
     $message = "After post SESSION(token1) is not present<br/><br/>"; 
    } else { 
     $message = "After post SESSION(token1) is present<br/><br/>"; 
    } 
} 
$_SESSION['token1'] = "abcxyz"; 
?> 
<html> 
    <body> 
     <?php 
     echo $message; 
     ?> 
     <form action="" name="frmLogin" id="frmLogin" method="POST" accept-charset="utf-8"> 
      <input type="submit" name="cmdSubmit" value="Submit" /> 
     </form> 
    </body> 
</html> 

方案1。當我點擊那個按鈕時,它會顯示「在post SESSION(token1)不存在後」(緊接着是Submit按鈕)。當我再次單擊該按鈕時,它會顯示「後會話(token1)存在」。場景2:當我通過追加「?nocache = 1」瀏覽到包含此代碼的頁面時,在第一次單擊後顯示「在post SESSION(token1)存在後」。方案3:當我在本地PC上的本地主機上瀏覽本頁時(即使沒有「?nocache = 1」),在第一次點擊之後,它顯示「存在post SESSION(token1)後」。

一種看法,即有一定幫助:在方案1的頁面後最初加載我檢查了瀏覽器的cookies爲域,看有沒有PHPSESSID cookie存在。點擊Submit一次後,cookie就在那裏。對於情景2和情景3,首次加載頁面後(並且在點擊Submit之前),PHPSESSID cookie存在。在每一種情況下,我都會在瀏覽頁面之前清除域名的Cookie。

正如你所看到的,在會話開始,會話變量被設置。那麼爲什麼在第一次回傳後沒有被識別呢?而且,更重要的是,如何在每個環境中首次加載頁面後對其進行編碼?

我首先想到的是,由於加入「?非緩存= 1」的URL使它在所有環境中,正常工作,如果我能以某種方式代碼PHP複製這種行爲,將解決這個問題。但我願意接受建議。

+0

我已經與會議的工作,但承認這當前經驗我難住了。我沒有看到我的問題沒有意義(嚴格來說,我的問題是第一段 - 其餘僅僅是上下文以防它有幫助)。 當我使用「?非緩存= 1」,一個會話cookie(PHPSESSID)瀏覽到一個頁面被立即創建,一切都會按計劃進行。當我瀏覽沒有「?nocache = 1「,它需要在創建PHPSESSID cookie之前進行一些回傳,並且會話變量是完全可用的。我知道會話存儲在服務器上,但是需要cookie。 – Bob

+0

因此,問題是,可以將「?nocache = 1」創建的行爲編碼,以便它不需要成爲URL的一部分? – Bob

+0

我終於明白你在問什麼,並且我發佈了一個答案。 – developerwjk

回答

0

?nocache=1沒有任何行爲本身。爲什麼你認爲?nocache=1有一個行爲是瀏覽器分別緩存index.phpindex.php?someparam=someval。它與任何含義?nocache=1無關。它的處理就像任何參數一樣。它也不會阻止發生緩存。你叫第二次index.php?nocache=1您將訪問緩存的版本,但它會爲index.php?nocache=1緩存不僅僅是index.php

我曾嘗試使用元標籤的所有建議(編譯,緩存控制,到期)

使用高速緩存控制meta標籤將大多數瀏覽器都被忽略。你需要做的是使用header()在PHP中設置緩存控制標頭:

<?php 
session_start(); 
header('Pragma: no-cache'); 
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0',true); 

應該在網頁的頂部打印任何東西之前完成。