2014-05-03 63 views
0

在主機從PHP 4.x升級到PHP 5.4.1之後,我的一個朋友在通過XMLHttpRequest(他使用jQuery)中訪問$ _SESSION變量時遇到了一個巨大的問題。

我希望他的代碼下面的片段是說明他的問題:

的index.php

<?PHP 
    session_start(); 
    $_SESSION['chatfenster'] = array(); 
    $_SESSION['user'] = 1; 
?> 
<!-- HTML Markup --> 
<script type="text/javascript" src="../scripts/jquery/js/jquery-1.8.2.min.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function() { 
     setInterval(function() { 
      $.post("http://www.his-domain.at/ticker_tracker.php", function(feedback) { alert(feedback); }) 
     }, 
     10000); 
    }); 

ticker_tracker.php:

<?PHP 
    session_start(); 
    var_dump($_SESSION); 
?> 

當他瀏覽到index.php和之後手動到ticker_tracker.php,$ _SESSION變量正確地var_dumped,但如果php文件通過$ .post()調用,$ _SESSION變量都是空的,因此警告強制t「array {}」。

主機支持說一切正常,他們根本沒有更改任何設置,但我注意到由於跨域請求,Chrome會阻止XMLHttpRequest,並提供錯誤消息(也僅在升級到PHP 5.4.1後出現):

XMLHttpRequest cannot load. No 'Access-Control-Allow-Origin' header is present. 

添加在每個PHP的最頂端訪問控制允許來源頭解決了這個錯誤,但主要問題(空$ _SESSION變量)仍然存在。

任何意見表示讚賞。提前致謝!

+0

大聲笑...如果你的朋友不能使用這個網站,那麼你是他的好朋友! – Coder

+0

不太清楚,如果我理解你的評論...代碼工作,直到主機更改PHP版本。他根本沒有改變代碼。 –

回答

0

如果您得到訪問控制允許來源錯誤(可以像添加標題所說的那樣解決該錯誤),那麼您正在執行跨域請求。這就是爲什麼你有不同的會議內容:他們是不同的會議!

這可以從一臺機器(域)到另一臺(www.one.com到www.two.com),這可以從一個子域到另一個子域(www.one.com vs one.com)或者這可能是一個不同的服務(例如http vs https,這些服務可能由不同的機器或進程提供服務)。

所有這些事情都有一個共同點:你有一個似乎要到另一個地方(因此允許起源)的請求。而另一個地方有不同的會議,因爲他們不共享。

檢查爲什麼你有訪問控制thingy:請求不會去同一個地方。因此,使用標題「修復」它只是修復了原點:刪除了「修復」,並使請求不再需要它。那麼你回到了相同的服務器/進程/任何,並將有相同的會話。

+0

似乎像$ .post()中的絕對路徑有問題。儘管URL完全相同,但在我們用相關路徑替換絕對路徑之後,它再次開始工作。 –