2011-06-02 62 views
1

在IE上,當用戶點擊返回按鈕時,他們得到的經典IE「網頁已過期」消息。即後退按鈕上的「網頁已過期」PHP會話問題

我發現在我的php.ini中設置以下內容已經解決了這個問題。

'session.cache_limiter=private' 

但是我現在的問題是,當我發送的形式包括我在一個隱藏字段一個PHP會話值($ _SESSION [「令牌」])。然後我檢查了這下頁,看是否標記值匹配

echo "<form ......<input type='hidden' name='token' value='".$_SESSION['token']."' />"; 

/*on recieving page*/ 
if($_POST['token']==$_SESSION['token']){/*ok matched*/} 
else{/*THIS IS WHERE THE ERROR OCCURS*/} 

我的問題是,因爲增加這些設置,以我的php.ini文件我發送表單時注意到我讓我的自定義頁面錯誤如因某種原因$ _SESSION ['token']值在接收表單數據的頁面上發生變化,從而使if()語句返回false?它現在在所有瀏覽器中都發生了嗎?這個是我的$ _SESSION ['token']代碼(注意,當發送我的表單時,它落在else()中,但$ _SESSION ['token']的值更改可能不會保留我的$ _SESSION值?

session_start() 
if(!isset($_SESSION['token'])) 
{ 
      $token = md5(uniqid(rand(), TRUE)); 
      $_SESSION['token'] = $token; /*have to put current session token into this variable for hidden field in <form>*/ 
      $_SESSION['token_time'] = time(); 
} 
else 
{ 
      /*if token set ie user press back button on browser*/ 
      $token_age = time() - $_SESSION['token_time']; 
      if ($token_age > 1200) 
      { 
         /* More than 20 minutes has passed - regenerate. Do this so more likely wont timeout when user taking long time on <form> and token may not get refreshed before time limit*/ 
         $token = md5(uniqid(rand(), TRUE)); 
         $_SESSION['token'] = $token; /*have to put current session token into this variable for hidden field in <form>*/ 
         $_SESSION['token_time'] = time(); 
      } 

} 

如果任何使用我的繼承人其他的php.ini會話設置

session.cache_limiter=private 
session.cookie_secure=1 ;my wholes site is SSL 
session.cookie_httponly=1 
session.save_path = /tmp ;directory to store sessions 
session.save_handler = files 
session.cookie_lifetime = 0 ;persistence cookie dies after browser closed 
session.use_trans_sid = 0 
session.use_only_cookies=1 

讓我清楚的東西了的傢伙,是使用「session.cache_limiter發生此整個問題的原因=私有'。如果我把它拿出來,除非我在IE中收到消息時纔會遇到問題在表單頁面上顯示「網頁已過期」的後退按鈕。是否有任何建議如何避免在點擊後退按鈕時出現在IE中的消息?

+0

觀察你的$ token_age怎麼樣? – 2011-06-02 11:22:10

+0

是的,但我沒有進入,如果()。就在else()中。 \t 它與該設置有關session.cache_limiter =私人作爲沒有它它的作品,但我在IE瀏覽器中獲得「網頁過期消息」,如果我把它拿出來。我錯過了一些我認爲緩存似乎在每個頁面上被刪除的東西。與session.cache_expire有什麼關係我想? – daza166 2011-06-02 11:46:12

+0

您是否檢查過HTTP標頭? – 2011-06-02 11:48:04

回答

4

ini_set(「session.cache_limiter」,「must-revalidate」);

+0

我可以把它放在我的php.ini中,如'session.cache_limiter = must-revalidate',還是必須在PHP腳本中使用ini_set()? – daza166 2011-06-02 12:06:15

+0

這是一個支持的選項嗎? http://www.php.net/manual/en/function.session-cache-limiter.php – BlaM 2011-06-02 12:09:46

+0

剛試過ini_set('session.cache_limiter','must-revalidate');在我的PHP代碼多數民衆贊成在導致相同的問題 – daza166 2011-06-02 12:11:09

1

這是HTML代碼嗎?

<input type='hidden' name='token' value='".$_SESSION['token']."' /> 

如果是的話,試試:

<input type='hidden' name='token' value='<?PHP echo $_SESSION['token']; ?>' /> 

:)


我從來都不是太高興與PHP內置的會話功能。對我來說太多問題...

您是否正在使用session_start()初始化會話處理?

您確定會話正在使用Cookie - 不是任何查詢字符串/ POST字段? (檢查瀏覽器中生成的HTML代碼)。

+0

+1對於從未太幸福。我從來沒有使用會話 – dynamic 2011-06-02 11:11:27

+0

是的我使用session_start()忘了將它粘貼在我提供的代碼中,我修改了我以前的問題,增加了一些可能導致問題的設置? – daza166 2011-06-02 11:16:42

+0

不,我明顯迴應PHP中的HTML

已經修改了以前的問題代碼。 – daza166 2011-06-02 11:35:58