【问题标题】:Laravel 5.2 TokenMisMatchException on Production Server生产服务器上的 Laravel 5.2 TokenMisMatchException
【发布时间】:2016-08-01 07:37:11
【问题描述】:

我在生产服务器上遇到 TokenMismatchException,但应用程序在本地 Xampp 服务器和另一个主机上运行良好。它是我们的内部服务器,因此我们无法更改它。我们必须使用它,但我们不明白问题出在哪里。

请朋友们帮助我,我是否需要更改服务器中的任何内容,例如插件、扩展或其他任何内容,请告诉我。这是下面的屏幕截图:

以上截图来自生产和托管提供商之一。在生产服务器上,laravel 应用程序给出了 tokenmismatchexception,而同一应用程序在另一个托管服务提供商上运行良好。我们不明白为什么会这样。请建议我们该怎么做。

更新:

我有新的 laravel 5.2 并运行 php artisan make:auth 之后我已授予该文件夹 777 权限,然后什么也没有。我仍然收到此异常。

【问题讨论】:

  • 生产服务器负载均衡吗?
  • 我想是的。我还没有配置服务器。工程师已经配置好了。
  • 如果服务器负载平衡并且您将会话存储在文件系统中,那么您将在发布表单时遇到问题。我在生产 Laravel 网站上经历过这种情况。如果 IP 不同,请在提交表单时检查帖子并获取信息,那么您将遇到我提到的问题。解决方案是 Redis 或类似的来处理会话并在 IP 的变化中持续存在
  • 我也使用数据库进行会话,但我仍然遇到同样的问题。
  • 如果您在 .env 文件中设置了 APP URL,那么这也可能是问题的一部分

标签: php laravel-5.1 laravel-5.2


【解决方案1】:

将其添加到您的 html 表单中

 <input type="hidden" name="_token" id="_token" value="{{csrf_token()}}">

在刀片中

{!! Form::token() !!}

并在 web middwlware 中添加您的路线

Route::group(['middleware' => 'web'], function() {
      // Place all your web routes here...
});

【讨论】:

  • 我正在使用 Html Collective anf 做 {{ Form::open() }} 这将自动添加令牌隐藏字段。如果这将是问题,那么为什么应用程序在另一个主机上工作。我认为问题与服务器有关,而不是与应用程序有关。
  • 我已经在我的表单中添加了 {{ csrf_field() }} 这一行,它也在生成令牌隐藏字段。
  • 我真的不明白为什么当开发人员明确表示它没有修复时人们会提高这个。表单上的 CSRF 令牌并不是发生这种情况的唯一原因!
【解决方案2】:

这可能是会话设置不正确。 尝试删除您的 PHP_SESSID cookie 或更改会话在服务器上的存储方式。

您还可以通过测试路线检查会话是否正常工作。

【讨论】:

  • 如何删除 PHP_SESSID cookie
  • @Mandy :如果您使用的是 Firefox,它位于 Preferences &gt; Privacy。其他浏览器不知道
【解决方案3】:

我有这个问题,对我来说问题是

SESSION_DOMAIN=custom_domain_here

在我的 .env 文件中进行设置,这在生产环境和本地环境之间是不同的。这将导致为域错误地创建会话并引发 TokenMismatch。

希望这对某人有所帮助。

【讨论】:

    【解决方案4】:

    我遇到了同样的问题,您必须在配置文件中创建令牌。

    尝试内置工匠命令$ php artisan key:generate 或手动创建密钥。

    【讨论】:

    • 这也行不通。密钥生成如下:应用程序密钥 [base64:some key=] 设置成功。
    • 然后在config/app.php中手动创建。我认为它应该是 32 个字符的长度。任何字符串。
    • 还要确保您在 ENV 文件中有适当的变量。
    • 是的,长度为 32 个字符,我也在使用 .env 文件。
    【解决方案5】:

    您的用户登录可能有问题。最近我面临同样的问题。就我而言,我使用Auth::login($user,true) 而不是Auth::login($user) 或Auth::attempt... 的问题

    其次,您还应该检查您的用户数据库中是否有 remember_token 列。

    第三,您需要检查会话的存储位置。

    希望对你有帮助!

    【讨论】:

    • 目前我没有自己做任何事情,我正在使用 laravel 脚手架。所以无论你说什么在我的情况下都是不可能的。目前我正在使用数据库进行会话,但之前我使用的是文件。
    【解决方案6】:

    我有同样的问题,我用过

    <form role="form" method="POST" action="{{ url('laravel-master/login') }}">
    
    <input type="hidden" name="_token" value="{{ session()->getToken() }}">
    

    我的表单视图中的这一行。

    【讨论】:

    • 尝试更新的答案。请确保您的网址与{{ url('laravel-master/login') }} 相同
    • 这也行不通。它还添加了两次 laravel-master。
    【解决方案7】:

    尝试验证您的会话文件 => App/Config '域名' => 'IP地址或域名', 如果域名有SSl认证 将安全变量更改为 True 我希望它会帮助你:D

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 2018-07-28
      • 2018-03-23
      相关资源
      最近更新 更多