csrf_token和X-XSRF-TOKEN
$http.defaults.headers.common['csrf_token'] = CSRF_TOKEN;
$http.defaults.headers.common['X-XSRF-TOKEN'] = X_XSRF_TOKEN;
该项目在本地服务器上正常运行但未在生产中运行。我在提交表单后看到了TokenMismatchException,并且Auth :: attempt()在登录期间工作正常。但登录后,当我通过Auth :: user() - > id访问其他路由的用户ID时,我看不到登录用户。
我还在本地服务器上检查了我的cookie。我可以在那里看到XSRF-TOKEN和laravel-session,但在生产中我的cookie列表是空的。
更新:发现该会话在我的服务器项目中无效。
答案 0 :(得分:2)
Session无法正常工作的问题是,在我的项目的Config文件(在我的案例中为/config/google-geocoder.php)中,PHP打开标记(<?php
)之前出现了一个空行。这就是为什么Laravel无法在cookie列表中创建任何会话(还有laravel的默认XSRF-token和laravel-session)。请参阅@codesidekick的回答,该链接帮助我解决了这个问题。 CSRF - Form Token Doesn't Match Session Token
我无法确切说明原因,但我的本地服务器的PHP版本为5.5.9-1ubuntu4.19
,而生产服务器的版本为5.5.30
。我认为由于配置上的一些差异,我在生产中遇到了问题。
在调查期间,我发现有几个问题可能会产生此问题。我也将我的一个列入下面的列表中。
<!DOCTYPE html>
源代码之前看到任何空行,则在打开PHP标记之前,页面的相关文件会有空行。在这种情况下,检查您为页面创建的已编译的PHP文件,如果没有,则查看Laravel的默认加载文件(index.php,routes.php,配置文件等),并确保在PHP之前没有空格打开你错误添加的标签。如果您只有令牌不匹配,请将令牌全局<meta name="_token" content="{!! csrf_token() !!}"/>
添加到您的标头中,或在您的表单<input type="hidden" name="_token" value="{ csrf_token() }">
中本地添加。对于ajax电话
$.ajaxSetup(
{
headers:
{
'X-CSRF-Token': $('input[name="_token"]').val()
}
});
检查/store/framework/Session
是否有权存储会话,因为默认情况下Laravel具有文件类型会话。您可以尝试数据库会话,我看到一些人工作。您也可以尝试从storage/framework/sessions
和storage/framework/views
See @gbrock's answer
有人说要清除缓存并重启服务器。