Laravel应用本地运行正常,AWS EBS(Nginx)报GET方法不支持错误
问题
本地使用php artisan serve运行Laravel应用完全正常,但部署到AWS Elastic Beanstalk搭配Nginx的生产服务器后,提交表单时抛出错误:The GET method is not supported for route : Supported methods: POST。
相关代码如下:
视图代码
<form action="{{ route('sign-up.company.store') }}" method="POST">@csrf
路由定义
Route::post('company/signup/store',[RegistrationController::class, 'signUpCompanyStore'])->name('sign-up.company.store');
控制器方法代码
// 出于安全考虑已移除部分代码 public function signUpCompanyStore(Request $request){ $request->validate([ 'first_name' => ['required','max:60'], 'last_name' => ['required','max:60'], 'email' => ['required','email','unique:users,email']]); $role = CompanyRole::where('name', 'Company')->first(); // 新用户注册 $company_name = $request->first_name.$number; $noWhiteSpaceString = str_replace(' ', '',$company_name); $smailletter = Str::lower($noWhiteSpaceString); $address = UserAddress::where('user_id',1)->first(); $data = User::create([ 'role_id' => 0, 'password' => Hash::make($request->password), 'email_verified_at'=> $address->is_verified == 2 ? now() : null, 'status'=>1 ]); Mail::to($data->email)->send( new SendEmailVerification($data)); $package = Package::where('slug','free')->first(); $order = CompanyOrder::create([ 'order_id' => id_generate(1,8), 'status' => 1, ]); Invoice::create([ 'user_id' => $order->user_id, 'status' => $order->status, ]); if ($address->is_verified == 1) { if ($address->cron_job_mail == 1) { dispatch(new SendEmailVerificationJob($data))->delay(now()->addSeconds(5)); } else { $email = new SendEmailVerification($data); Mail::to($data->email)->send($email); } } Auth::login($data,true); return redirect()->route('login')->with('success','Registration Successfuly !'); }
解决办法
1. 修正Nginx URL重写配置
AWS Elastic Beanstalk默认Nginx配置可能未正确处理Laravel的URL重写,导致POST请求被转成GET。需确保Nginx配置包含以下规则:
location / { try_files $uri $uri/ /index.php?$query_string; }
在Elastic Beanstalk中,可通过创建.platform/nginx/conf.d/laravel.conf文件添加该配置,部署时会自动生效。
2. 清除并重建路由缓存
生产环境Laravel会缓存路由,若部署后未更新缓存,可能导致路由匹配异常。执行以下命令:
php artisan route:clear php artisan route:cache
可在Elastic Beanstalk的部署脚本或容器命令中自动执行这些操作。
3. 检查表单实际请求方法
用浏览器开发者工具(F12)查看网络请求,确认表单提交时确实发送POST请求。若被重定向为GET,可能是HTTPS跳转配置问题,需确保Elastic Beanstalk负载均衡器或Nginx在HTTP转HTTPS时保留请求方法。
4. 验证路由URL匹配一致性
确认生产环境中route('sign-up.company.store')生成的URL与路由定义的company/signup/store完全一致,Nginx默认区分URL大小写,大小写不匹配会导致路由无法命中。
5. 排查CSRF令牌问题
虽然表单已添加@csrf,但生产环境会话配置异常可能导致CSRF验证失败,Laravel会自动重定向请求为GET。查看storage/logs/laravel.log日志,若有CSRF相关错误,需确保会话驱动配置正确(多服务器环境下避免使用文件驱动,改用Redis或数据库驱动)。
内容的提问来源于stack exchange,提问作者Milon Hossain

