php - 将 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 错误。
解决方案
对于将来遇到此问题的任何人。如您所知,此错误具有令人难以置信的误导性。事实证明,该错误是由于 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
这是两部分错误。它在数据库中找不到用户,一旦我修复了数据库连接,它就无法连接,因为它在缓存中使用旧配置。清除缓存修复它。
推荐阅读
- phpstorm - 如何在 PhpStorm 中的选项卡之间切换?
- apache-flink - 如何在纱线模式下运行 flink scala shell
- ios - 如何在 UITableview DataSource 方法中的 UIContextualAction 中添加图像
- c++ - 为什么 `operator<<` 对指向派生类型的成员不起作用?
- html - 如何使用表格在模态文本框
- android - 图书馆项目:如何覆盖属性?
- sql - SSRS 报告。在下拉参数中全选
- angular - Angular 6 通信子级 - 具有 ng 内容的父级
- mysql - 从 RDS 快照中使现有用户无效并在从快照创建新实例时创建新用户
- javascript - 如何在javascript中将图像源文件信息添加到另一个数组中的新数组中