我们有一个带有 SSL 终止功能的 Nginx 负载均衡器。它后面是两个运行 nginx/laravel 5.1 的 Web 服务器,并且都在 redis 上共享 session 。当负载平衡设置为 session 关联模式(用户返回同一服务器)时, session 可以正常工作。如果我们使用循环,我们将面临 CSRF“Illuminate\Session\TokenMismatchException”,并且用户不会获得有效的 session 。如何让 session 以循环方式运行?
这是 nginx 上的代理设置。
proxy_set_header 'Access-Control-Allow-Origin' '*';
proxy_set_header 'Access-Control-Allow-Credentials' 'true';
proxy_set_header 'Access-Control-Allow-Headers' 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept';
proxy_set_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
在登录 Blade 上我们有
<div class="signin_form_modal">
<div class="signin_form">
<form id="signin_form">
<div class="modal_header">
<a href="#" class="modal_back inline" title="close">+</a>
<h1 class="modal_title">Sign in</h1>
</div>
<div class="modal_input_group">
{!! csrf_field() !!}
<input type="text" name="email" placeholder="Username or Email" class="email modal-input">
<input type="password" name="password" placeholder="Password" class="password modal-input">
</div>
<div class="modal_footer">
<!--<a href="#"><i class="fa fa-check"></i> Done</a>-->
<button class="submit" type="submit"><i class="fa fa-check"></i> Done</button>
</div>
</form>
</div>
</div>
路由定义为
Route::post('/signin', 'Auth\AuthController@signin');
最佳答案
某些提供商的 session 存储在本地服务器上。 如果用户因负载均衡而更换服务器,则所有 session 都会丢失。
唯一的解决方案是使用跨服务器共享的 session 提供程序。
关于Laravel CSRF 在 nginx 后面带有 SSL 负载平衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33797128/