2015-10-15 29 views
3

我的生產服務器上出現了一個奇怪的情況。但是,在我的本地開發環境中這不是問題。這是一個測試腳本,我可以複製的問題:PHP post_id()在POST後更改

<?php 

session_start(); 

$_SESSION['test'] = 'test'; 

echo 'session_id(): '.session_id(); 

session_write_close(); 

?> 

<form method="POST"> 
    <input type="submit" value="Post to self" /> 
</form> 

如果我在瀏覽器中加載該頁面,並刷新頁面(CTRL + R),我每次都顯示相同的session_id()值。

但是,如果我再點擊提交按鈕,我得到兩個不同的結果:

  • 發展:同session_id()值(預期結果)。
  • 生產:a 不同session_id()值。

此外,在生產服務器上,如果我再重新載入頁面,我得到了session_id()值回。

如何讓生產服務器保留session_id()值?任何建議將不勝感激。

謝謝!

詳情點評: 在我張貼的簡單的例子,它是這樣的:

array(5) { 
     ["lifetime"]=> int(0) 
     ["path"]=> string(1) "/" 
     ["domain"]=> string(0) "" 
     ["secure"]=> bool(false) 
     ["httponly"]=> bool(false) 
     } 

在實際生產中的代碼是這樣的:

array(5) { 
     ["lifetime"]=> int(0) 
     ["path"]=> string(1) "/" 
     ["domain"]=> string(0) "" 
     ["secure"]=> bool(true) 
     ["httponly"]=> bool(true) 
     } 

(我使用生產中的HTTPS)。

+0

閱讀此問題並回答[http:// stackoverflow。COM /問題/ 7180559 /應-I-再生,會話ID上,每一個頁面(http://stackoverflow.com/questions/7180559/should-i-regenerate-session-id-on-every-page ) – 2015-10-15 17:08:21

+0

'var_dump(session_get_cookie_params())'? – Federkun

+0

@Federico - 在我發佈的基本示例中,如下所示: 'array(5){[「lifetime」] => int(0)[「path」] => string(1)「/」[在實際的生產代碼中,它是這樣的: 'array [0]「[」secure「] => bool(false)[」httponly「] => bool(false)}' (5){[「lifetime」] => int(0)[「path」] => string(1)「/」[「domain」] => string(0)「」[「secure」] => bool (true)[「httponly」] => bool(true)}' (我在生產中使用HTTPS)。 – user4024288

回答

0

對不起大家;野鵝追逐。根據我的主機的建議,我運行EasyApache將服務器升級到PHP到v5.5。在這種情況下,PHP處理程序無意中被切換到SuPHP以外的地方,因此在/tmp的會話文件中存在讀取權限問題。結果,PHP不斷地生成新的會話文件。

編輯:我也應該注意到is_writable(session_save_path())正在返回true,這是什麼誤導了我對這個問題的理解。

-1

// session_regenerate_id()

session_start(); 

    if(isset($_POST)){ 
     $_SESSION['IDONE'] = session_id(); 
     session_regenerate_id(); 
     $_SESSION['IDTWO'] = session_id(); 
     var_dump($_SESSION); 
    } 

設置 「名稱」 屬性到<input>標記,以便在$_POST變量將包括一個可變的。

PHP Manual

+0

我明白你的建議,但不幸的是會話數據不會持續。如果我在另一個腳本中設置了一些會話變量,然後加載這個腳本和'var_dump($ _ SESSION)',我可以最初看到這些數據,但如果我提交表單,那麼它就消失了。 – user4024288

+0

試試這個方法:) – wayzz

0

最保險的辦法是告訴PHP使用Cookie。需要用戶允許會話cookie。

session_name(SESSION_NAME); 

// PHP 5.2+ Prevent x-domain cookie sess theft. Dont let Client scripts see cookie 
$HTTPONLY = 1; // 0 or 1; 

if (function_exists('session_set_cookie_params')) 
{ 
    session_set_cookie_params(3600, '/', '.domain.com', 0, $HTTPONLY); 
} elseif (function_exists('ini_set')) 
{ 
    ini_set('session.cookie_lifetime', 3600); 
    ini_set('session.cookie_path', '/'); 
    ini_set('session.cookie_domain', '.domain.com'); 

    ini_set('session.cookie_httponly', $HTTPONLY); 
} 

您也可以通過表單變量繼續傳遞SESSION_ID,但這並不安全。

+0

注意你需要在 之前做以上操作\t session_start(); –

+0

另外,如果您的開發主機是「本地主機」或IP地址,這將無法正常工作。如果您使用的子域或域名,甚至localhost.com它將工作./ –

+0

我感謝您的反饋@Baine,雖然我認爲這是一個配置問題比代碼問題更多。同樣的例子在我嘗試過的其他多個環境中工作。所以我想知道cPanel/WHM(運行這個服務器)是否有問題,或者會話路徑問題(它是'/ tmp' FWIW ) - 儘管PHP告訴我這個路徑是可寫的。 – user4024288