【发布时间】:2016-10-24 18:38:52
【问题描述】:
我正在将 Laravel 5.1 网站更新为 Laravel 5.2.39。我在“已批准”的升级过程(尤其是中间件)方面遇到了很多问题,所以我最终创建了一个新的 Laravel 5.2 站点,只是从旧站点转移了我的视图、模型和控制器。它似乎正在工作,除非我提交任何表单时出现令牌不匹配异常:
TokenMismatchException in VerifyCsrfToken.php line 67:
我的表单中有令牌(使用{{ csrf_field() }}):
<div class="form-group">
{!! Form::label('name', 'Name') !!}
{!! Form::text('name', old('name'), ['placeholder' => 'Name', 'class' => 'form-control']) !!}
</div>
<div class="form-group">
{!! Form::label('email', 'Email') !!}
{!! Form::email('email', old('email'), ['placeholder' => 'Email', 'class' => 'form-control']) !!}
</div>
<div class="form-group">
{!! Form::label('phone', 'Phone') !!}
{!! Form::text('phone', old('phone'), ['placeholder' => 'Phone', 'class' => 'form-control']) !!}
</div>
{{ csrf_field() }}
<div class="form-group">
{!! Form::submit('Submit', ['class' => 'btn btn-default btn-small']) !!}
<input type="reset" class="btn btn-primary btn-small" />
</div>
我已经清除了我的 cookie,还尝试将 config/session.php lifetime 设置为更高的数字,以确保它不会超时。
这是在宅基地箱上运行的。
有什么想法可以尝试吗?
编辑:这是有问题的路线
Route::resource('contact', 'ContactController');
EDIT2:这是路由文件。我不认为在 Laravel 5.2 中将路由包装在 Web 中间件中是必需的——但是,我已经尝试了两种方法,但出现了同样的错误。
Route::group(['middleware' => ['web']], function () {
Route::get('/', 'AccountController@index');
Route::resource('account', 'AccountController');
Route::resource('contact', 'ContactController');
});
在控制器的创建操作中转储$request->session()->token() 会在带有表单的页面上显示当前会话令牌。这与添加到表单中的标记相同(使用查看源检查)。
但是当它到达Illuminate\Foundation\Http\Middleware\VerifyCsrfToken::tokensMatch() 类时,我转储了会话令牌,它与表单令牌不同——这意味着它们永远不会匹配。不确定这里会发生什么。
【问题讨论】:
-
能否请您出示您在该论坛的
POST路线? -
@xdevnull-- 它在
resource路线上,但我会编辑我的答案。谢谢 -
@user101278 他们在Web Group Middleware下吗?
-
@xdevnull-- 不,目前只有 4 条资源路由,没有一个在一个组中,也没有一个显式附加中间件。我以为
5.2中的web中间件是自动应用的? -
版本 >
5.2.28
标签: php laravel laravel-5.2 token csrf