2013-10-10 43 views
1

我猜不是Laravel問題,但它是我正在使用的PHP框架。在Laravel PHP和AngularJS中的子域之間維護會話

我有以下子域:app.hostname.devapi.hostname.dev

我有對API的API一個laravel PHP應用程序。和應用程序上的AngularJS SPA應用程序。

如果我在API上創建一個會話變量,它只能用於該子域。如果我從前端執行GET AJAX請求,則下面的var_dump將返回NULL。如果我將我的API端點更改爲相同的子域(app.hostname.dev),我會得到正確的會話變量。

//Session::put('test', 'TESTING'); 
var_dump(Session::get('test')); 

這裏是我的laravel會話設置:

'driver' => 'cookie', // also tried database 
'path' => '/', 
'domain' => '.hostname.dev', 

這裏是我的AngularJS設置:

$httpProvider.defaults.useXDomain = true; 
delete $httpProvider.defaults.headers.common['X-Requested-With']; 

我覺得上面的設置就足以保證跨域會話?

UPDATE

問題不是跨域問題,但似乎更像是一個事實,即請求通過AJAX來了。作爲app.創建的seession var在api.上可用,但無法通過ajax獲取請求。

回答

2

在我的服務器上,問題沒有在角度上設置withCredentials: true;,也沒有在我的服務器上設置Access-Control-Allow-Credentials: true

Cookies未與請求一起發送。

在角配置:

$httpProvider.defaults.withCredentials = true; 

在我的routes.php文件中laravel:

header('Access-Control-Allow-Credentials: true'); 
+0

更好的方法是將'header(...)'放在'app/filters.php'中'App :: before',它在請求之前運行。 Routes.php不應該負責或關心標題,所以不要離開它。 – davidnknight

+0

好點謝謝! – iamjonesy

0

我假設你正在同一個盒子上運行你的子域?

而你正在通過PHP使用cookie嗎?如果是這樣,你的Cookie根域是什麼(http://php.net/manual/en/function.setcookie.php

如果你的cookie域設置爲root「hostname.dev」,那麼它應該在你的子域中都可用。

+0

是的,它實際上是在同一個項目的一部分。我已經通過Laravel會話配置設置了Cookie域。我嘗試了.hostname.dev,並且也沒有''''''' – iamjonesy