2013-08-21 97 views
0

我想實現一些代碼,這將允許我有一個子域與另一個子域進行通信,例如, one.example.comtwo.example.com。這兩個網站有能力共享cookie和會話數據,因爲我已將cookie設置爲使用.example.com交叉源請求與Kohana和JavaScript

當我通過標準HTTP訪問任一站點時,我可以轉儲會話並查看預期數據。但是,如果我通過JavaScript與jQuery $.ajax()這樣做,轉儲的會話數據是空的。在這兩種情況下,我都使用PHP來轉儲會話數據。

我已經嘗試過以下解決方案,但沒有運氣(http://forum.kohanaframework.org/discussion/9895/problem-session-expired-with-ajax/p1)。我也在使用一個稍微更新版本的Kohana(3.3)。

我也試過,儘快爲他們到達控制器設置標題:

$this->response->headers('Access-Control-Allow-Origin', 'http://one.example.com'); 
$this->response->headers('Access-Control-Allow-Credentials', 'true'); 
$this->response->headers('Access-Control-Allow-Methods', 'POST, GET, OPTIONS'); 

然而,Chrome檢查仍顯示Access-Control-Allow-Origin*

回答

2

的問題

我是有這個問題是由於在我的Apache的配置文件中的設置,其是這樣的:

<IfModule mod_headers.c> 
    Header set Access-Control-Allow-Origin "*" 
</IfModule> 

爲了解決我的特定問題,我簡單移除/註釋掉了上面的代碼,因爲它重寫了我從PHP發送的頭文件。

我實施的解決方案非常簡單。在下面的例子中,我們假設我正在撥打one.example.com(主要網站)到two.example.com(子網站)。

的Kohana/PHP

在我的PHP我設置下列頭,我選擇了做這在我父控制器。如果您願意,您可以創建自己的Cors類或幫助器。基本上,您不希望在整個項目中重複使用此代碼數百次。

$this->response->headers('Access-Control-Allow-Origin', 'http://one.example.com'); 
$this->response->headers('Access-Control-Allow-Credentials', 'true'); 
$this->response->headers('Access-Control-Allow-Methods', 'POST, GET, OPTIONS'); 

的JavaScript/jQuery的

在我$.ajax()請求,然後我必須確保到xhrFields.withCredentials屬性設置爲true

$.ajax({ 
    url: 'two.example.com', 
    xhrFields: { 
     withCredentials: true 
    } 
}); 

或者,我可以在全球範圍設定所有Ajax請求,像這樣:

$(document).ajaxSend(function (event, xhr, settings) { 
    settings.xhrFields = { 
     withCredentials: true 
    }; 
}); 

欲瞭解更多信息,請檢查$.ajax文檔:http://api.jquery.com/jQuery.ajax/

進一步閱讀

爲了進一步信息結帳以下資源: