2016-09-28 60 views
4

我正在使用子域,會話和Ajax的PHP項目中工作。但不幸的是,我無法讓它工作!我會盡力解釋:PHP會話如何使用子域和AJAX工作?

讓我們假設我在這個領域:app.mysite.com/index.php

在這個領域,我必須執行一個Ajax請求形式mysite.com/functions/execute.php(沒有任何子域)

execute.php的第一行中,我有一個require_once,包括一個helper.php文件。在這個文件中,我已經提出了:

ini_set('session.cookie_domain', '.mysite.com'); 
session_set_cookie_params(0, '/', '.mysite.com'); 
session_start(); 

列出的所有PHP文件還包括helper.php。

如果我的例子來看:

echo $_SESSION["myValue"]; 

app.mysite.com/index.php或任何其他子網域,例如auth.mysite.com,我會得到的值: 「test」。 但是,如果我在execute.php運行相同的代碼,並通過Ajax返回值,我會得到未定義的索引!

我在做什麼錯?

+0

http://stackoverflow.com/questions/14611545/preserving-ses sion-variables-across-different-domains –

+0

這些可能是相關的。 [1](http://stackoverflow.com/questions/9153716/sharing-session-variables-between-multiple-subdomains),[2](http://stackoverflow.com/questions/1064243/php-sessions-across - 子域),[3](http://stackoverflow.com/questions/644920/allow-php-sessions-to-carry-over-to-subdomains)只有「可能」,因爲這些都是3歲以上問題,所以他們可能不再工作了。如果你願意,可以在你的問題中加入你的PHP版本,如果其中一個解決了你的問題,回答你自己的問題,或者留下評論說那些解決方案仍然很好。 – Terminus

+0

感謝您的答案,但不幸的是我無法使用AJAX獲取$ _SESSION值。 如果我打開AJAX請求的URL,在我的Web瀏覽器中,我可以看到$ _SESSION值。只使用不起作用的AJAX! – jNewbie

回答

1

我已經弄清楚如何使這項工作。阿賈克斯郵政法不發送默認頭憑據,所以我們需要手動啓動:

$.ajax({ 
    method : "POST", 
    url  : "https://example.com/functions/execute.php", 
    data  : myData, 
    xhrFields: { 
     withCredentials: true 
    } 
}).done(function(result) { 
    alert("success")); 
}); 

而且在execute.php你需要把:

ini_set('session.cookie_domain', '.example.com'); 
session_set_cookie_params(0, '/', '.example.com'); 
session_start(); 
header('Access-Control-Allow-Credentials: true'); 

如果你從這個請求一個子域,還需要將其投入使用example.php

header('Access-Control-Allow-Origin: http://app.example.com'); 
1

如果您的項目是基於Web的應用程序,您可以使用簡單的技巧輕鬆地在所有域中設置Cookie /會話。肯定這適用於cookies,但從未嘗試過會話。讓我們做Google做的事吧。創建一個PHP文件,在所有3個域上設置cookie。然後在要設置主題的域上創建一個HTML文件,該文件將加載在另外兩個域上設置cookie的PHP文件。例如:

<html> 
    <head></head> 
    <body> 
     <p>Please wait.....</p> 
     <img src="http://domain2.com/setcookie.php?theme=whateveryourthemehere" /> 
     <img src="http://domain3.com/setcookie.php?theme=whateveryourthemehere" /> 
    </body> 
</html> 

保持隱藏那些img元素,因此它不會在前端顯示任何破碎的形象,如果網頁是user.Then可見身體標記添加一個onload回調。該文檔只會在圖像完全加載時加載,即在另外兩個域上設置cookie時加載。的onload回調:

<head> 
    <script> 
    function loadComplete(){ 
     window.location="http://domain1.com";//URL of domain1 
    } 
    </script> 
</head> 
<body onload="loadComplete()"> 

我們使用這樣的PHP文件中設置的Cookie在其他領域(setcookie.php ):

<?php 
if(isset($_GET['theme'])){ 
    setcookie("theme", $_GET['theme'], time()+3600); 
} 
?> 

現在Cookie是在三個領域:),並與設置web應用程序,你知道如何檢索cookie :)

Ofcourse您可能需要按照您的要求在此代碼中嘮叨。但是,這本肯定會給你一個想法繼續

希望這有助於

+0

感謝您的回答,但沒有幫助我。我想要做的是使用Ajax中的子域和根域之間的相同會話,但我已經知道如何做到這一點! – jNewbie