2015-10-08 36 views
2

只是一個新手,所以請原諒我的錯誤。
我正在使用.shtml頁面(SSI)的網站上工作。 我正在嘗試在我的.shtml頁面中包含一個PHP腳本。 到目前爲止,一切工作正常: PHP腳本被包含在內,它完成了它的目的。 這裏是實際的例子。 有主頁(index.shtml),包括腳本調用security_check.php這個指令:當SHTML頁面包含腳本時,PHP會話不工作

<!--#include virtual="includes/security_check.php?idOp=000&idPage=0000" -->

這是security_check.php PHP代碼:

<?php 

session_start(); 

include('config.php'); 
include('myfunctions.php'); 
include('security_functions.php'); 

$idOp     = $_GET['idOp']; 
$idPage    = $_GET['idPage']; 
$allowedReferer  = array(); 

// Connection to the database (defined in myfunctions.php) 
$link = DB_Connect($DBhost, $DBuser, $DBpass, 1, $DBname); 

// Check if the PHP session already exists. If not, create one 
// (that is insert a record in the DB and returns the id, which 
// will be stored in the PHP session variable). 
// user ID is 0 because not logged yet 
if (!isset($_SESSION['idSess'])) { 
    $_SESSION['idUser'] = 0; 
    $_SESSION['idSess'] = create_session(); // security_functions.php 
} 

// Please note that create_session() correctly use $_SESSION['idUser'] 
// in order to do its work, even if it's not passed as a parameter 
// (as it should be: $_SESSION is a superglobal!) and the same goes 
// for activity_supervisor(). 

// Defined in security_functions.php: 
// it uses both $_SESSION['idUser'] and $_SESSION['idSess'] 
activity_supervisor($idPage,$allowedReferer,2,$link); 

mysql_close($link); 

?> 

在這點, 主頁正確顯示,並在其中有一個「註冊」按鈕 ,調用sign.shtml。 這sign.shtml頁面包括非常相同 security_check.php腳本 完全相同的包括已經看到所不同的是idPage參數的值,在這種情況下是0001

指令我希望腳本識別PHP會話,因此 不是創建一個新的會話,但確實創建了一個新的會話每隔時間。

我已經閱讀了所有其他與PHP會話相關的帖子不工作,我甚至嘗試過那裏提出的解決方案。
- 在session_start()是在每個腳本的頂部開始寫,因爲有只是一個腳本
- 的session.save_path等於到/ var/lib中/ PHP /會話,並且是可寫的Web服務器
- 我已經嘗試過設置session.gc_probability = 0並重新啓動web服務器(無濟於事,所以我回到session.gc_probability = 1)
- 我用不同的瀏覽器(即Firefox和Chrome)嘗試了相同的結果

所以我嘗試了下面的測試(注意session_start()之前的那兩個空行):我總是用空間指令這種方式來提高可讀性) cre阿婷一個簡單的腳本test.php的

<?php 

session_start(); 

if (!isset($_SESSION['foo'])) { 
    $_SESSION['foo'] = 1; 
    echo ('Value is '.$_SESSION['foo'].'<br/>'); 
    echo ('<a href="test.php">Refresh</a>'); 
} 
else { 
    $_SESSION['foo']++; 
    echo ('Value is '.$_SESSION['foo'].'<br/>'); 
    echo ('<a href="test.php">Refresh</a>'); 
} 

?> 

好吧,不管你信不信,我每次打「刷新」, 增加價值,所以PHP識別會話(在test.php的腳本里面與index.shtml和sign.shtml頁面相同的域)。
我甚至試圖讓PHP腳本顯示一個.html文件(不是.shtml)的鏈接,然後顯示一個test.php鏈接。它工作正常!

當PHP腳本包含到.shtml頁面時,即使看不到任何理由,它確實似乎沒有正確設置會話。也許你知道爲什麼,首先是如何規避這種無聊的行爲?它是一個功能嗎?它取決於php.ini中的參數設置嗎?

最後提示:
OS:CentOS的6.3 2.6.32-279.el6.x86_64內核
Server版本:阿帕奇/ 2.2。15(Unix)
PHP 5.3.3
服務器是我的,所以我可以配置一切,如果需要的話。

在此先感謝並原諒我發表了長篇文章:我試圖使其明確表明PHP會話在我所知的其他任何情況下都能夠完美地工作。

+0

TL; DR但是...您是否知道您正在插入PHP腳本的**輸出**,而不是其代碼? –

+0

如果您只是使用PHP包含而不是SSI作爲會話腳本,那將會簡單得多。 – Derek

+0

您不能調用'session_start()'或任何需要使用mod_include(SSI)修改頭文件的任何東西。將URL直接連接到PHP腳本或使用ESI。 – symcbean

回答

0

我不認爲這將工作,因爲SSI將執行PHP腳本,然後將其輸出發送到Web服務器。您需要重寫URL的某種方式,以便它們不依賴於Cookie,因爲在服務器將它們發送到瀏覽器之前,cookie會被「吃掉」。

嘗試使用

ini_set("session.use_cookies",0); 
ini_set("session.use_trans_sid",1); 

,然後你需要發送SID在傳出網址(在帖子頁,太)。例如,請參閱this answer

具體來說,您需要將用戶重定向不sign.shtml但像

$sidkey = session_name(); 
$sidval = session_id(); 
print "sign up: <a href=\"sign.shtml?{$sidkey}={$sidval}\">here</a>"; 

,包括這在SSI輸出。

UPDATE:問題的根源在於SSI不能創建會話(不能發送什麼,但純HTML使用Cookie靠頭會議,不僅是HTML)。但是,如果您使用在SSI之外啓動的PHP腳本創建會話,並且可以設置cookie,則從該點開始,所有PHP腳本(無論是否SSI)都可以通過讀取 cookie,因此將能夠訪問和修改會話(這是由會話cookie的值標識的服務器上的文件/內存/ Redis /其他)。

您可以檢查whether a cookie is set in SSI,如果沒有,您可以重定向到一個純PHP頁面,該頁面設置會話cookie並使用HTTP重定向發送回原始shtml。

+0

@Iserni謝謝你的回答。還有一些我沒有得到的(當然是我的錯)。我只是試圖創建一個簡單的PHP腳本,並告訴它 – Ambrosia

+0

@Iserni感謝您的回答。我有一點更新(澄清)。如果我在PHP腳本中創建一個會話,那麼我會繼續訪問一個.shtml頁面,該頁面包含一個通過SSI的外部PHP腳本,這個腳本確實可以看到會話以及存儲在其中的所有變量。反之亦然(例如,如果我在.shtml頁面中包含PHP並且此PHP創建會話,則以下PHP腳本將不會看到該會話。儘管如此,這個會話還存在於我的瀏覽器中,所以我想它並沒有像我期望的那樣得到傳播。我試圖設置use_cookies和use_trans_id但沒有改變。 – Ambrosia

+0

我試圖更好地解釋發生了什麼事。我也想到了一個解決方法:-) – LSerni