我在子域上有一个单独的REST API的站点,例如api.mysite.com,我发送CRUD请求.API子域具有此过滤器,为响应添加适当的标头:
// Simple CORS handling
Route::filter('cors', function($route, $request, $response) {
$origin = Request::header('Origin');
$host = parse_url($origin, PHP_URL_HOST);
// Don't send response for external domains.
if (!in_array($host, Config::get('domains'))) {
App::abort();
}
$response->headers->set('Access-Control-Allow-Origin', $origin);
$response->headers->set('Access-Control-Allow-Headers', 'Accept, Accept-Encoding, Accept-Language, Content-Length, Content-Type');
$response->headers->set('Access-Control-Allow-Methods', 'DELETE, GET, PATCH, POST, PUT');
$response->headers->set('Access-Control-Allow-Credentials', 'true');
});
Run Code Online (Sandbox Code Playgroud)
我还设置crossdomain: true和xhrFields: { withCredentials: true }我的jQuery的$.ajax请求.请求设法通过服务器,访问适当的路由等,但身份验证过程出现问题.每次,Laravel就像用户没有登录一样,导致请求Auth::user()返回null.检查Firebug中的请求显示Cookie标头是在带有Laravel会话ID的请求中发送的,但是服务器响应SetCookie,就像尝试启动新会话一样.我可能在这里做了一些愚蠢的事情,但我最终试图确定是什么.
更新:从一些调试,我发现了一些有趣的东西.不知道它意味着什么.要访问相关页面,用户必须登录.因此,当页面加载时,浏览器中会有一个laravel_session cookie.然后,我通过与页面交互发送一些(跨域)AJAX请求.第一个请求根本没有设置cookie,并从服务器获取新的laravel_session cookie集.然后第二个请求包含该cookie,但是对它的响应又发回另一个新cookie,好像后端从未得到关于第一个的备忘录.我开始怀疑这不是与cookie域或某些事情有关.
我终于弄明白了。
首先,xhr 和路由过滤器都配置正确。这个问题的根本原因肯定是cookie问题。
laravel_session 的 cookie 域最初并未设置。浏览器将其解释为“当前域”的简写。也就是说,app.mysite.com 我需要做的是将 Laravelsession.domain配置中的值显式设置为“.mysite.com”,这样,相同的会话 cookie 就可以用于 app.mysite.com、api.mysite.com以及 mysite.com 的任何其他子域 问题已解决!
也就是说,我在实现此解决方案的过程中遇到了两个问题: