首页 > 解决方案 > 将 Laravel 项目迁移到新实例后 POST 和 GET 错误。原因是什么?

问题描述

我将我的 Laravel 项目移动到一个 AWS 实例。一切似乎都运行良好。当我登录时,我得到的错误"The GET method is not supported for this route. Supported methods: POST."似乎发生在login(Request $request){}找到的函数 上,./vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php我已经在 Ubuntu 和 Redhat 实例上尝试了该项目并得到相同的错误。我正在尝试寻找解决此错误的其他方法。任何意见,将不胜感激。

形式

<form class="form" method="POST" action="{{ route('2faconfirm') }}">

路线

Route::post('2faverify', [ 'as' => '2faverify', 'uses' => 'MFAController@verify']);
Route::post('2faconfirm', [ 'as' => '2faconfirm', 'uses' => 'MFAVerifyController@confirm']);

The process I took to migrate
- Dump mysql db for lavarel
- import laravel to new instances
- install php/mysql/composer/npm
- copy over files
- edit .env file to new db

@aynber 提出了一个很好的观点。我在代码中使用重定向。

    public function 2faverify(Request $request)
    {
        $response = $this->2faSendCode($request->get('email'), $request->get('password'));

        $client   = app()->make(CognitoClient::class);

        if($client->getUserStatus($request->get('email')) == 'FORCE_CHANGE_PASSWORD'){
            return view('auth.passwords.force-password-reset', ['session'=>$response['Session']]);
        }
        if(gettype($response) != 'string'){
            return view('2faverify',['session' => $response['Session']]);
        }else{
            return redirect('login')->withErrors([$response]);
        }
    }





    public function 2faconfirm(Request $request){

        $email      = $request->get('email');
        $password   = $request->get('password');
        $session    = $request->get('session');
        $2faCode    = $request->get('2facode');
        $client     = app()->make(CognitoClient::class);

        if($client->confirm2fa($email, $password,$session, $2faCode)){
            $this->login($request);
            return redirect('dashboard');
        }else{
            return redirect('login')->withErrors(['Code expired!']);
        }

    }

但我不明白这可能是什么问题,因为如果它出错return redirect(意味着我至少已经成功登录。但在出现此错误后我没有登录。

php artisan optimize 下面的错误

Configuration cache cleared!
Configuration cached successfully!
Route cache cleared!

   LogicException  : Unable to prepare route [api/user] for serialization. Uses Closure.

  at /var/www/html/wave-app/vendor/laravel/framework/src/Illuminate/Routing/Route.php:917
    913|      */
    914|     public function prepareForSerialization()
    915|     {
    916|         if ($this->action['uses'] instanceof Closure) {
  > 917|             throw new LogicException("Unable to prepare route [{$this->uri}] for serialization. Uses Closure.");
    918|         }
    919|
    920|         $this->compileRoute();
    921|

  Exception trace:

  1   Illuminate\Routing\Route::prepareForSerialization()
      /var/www/html/wave-app/vendor/laravel/framework/src/Illuminate/Foundation/Console/RouteCacheCommand.php:62

  2   Illuminate\Foundation\Console\RouteCacheCommand::handle()
      /var/www/html/wave-app/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:32

  Please use the argument -v to see more details.

我通过从 routes/api.php 中删除以下内容来纠正此错误

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

我可以毫无错误地运行优化

Configuration cache cleared!
Configuration cached successfully!
Route cache cleared!
Routes cached successfully!
Files cached successfully!

但这并没有解决登录时的 POST 错误。

标签: phplaravelubunturedhat

解决方案


对于将来遇到此问题的任何人。如您所知,此错误具有令人难以置信的误导性。事实证明,该错误是由于 laravel 无法连接或找到正在尝试登录的现有用户。我通过在我的登录代码中运行以下内容发现了问题。

 use App\User; //be sure to include in top of page else a new error will appear

        $user = User::where('email', '=', $request->get('email'))->first();
        if ($user === null) {
           echo "user does not exist";
        } else{
           echo "exists";
        }
        exit();

我继续得到用户不存在。我更正了数据库问题,但仍然错误地认为用户不存在。最后,我运行了以下命令,它解决了这个问题。

php artisan cache:clear
php artisan config:cache

这是两部分错误。它在数据库中找不到用户,一旦我修复了数据库连接,它就无法连接,因为它在缓存中使用旧配置。清除缓存修复它。


推荐阅读