Laravel 5.8线上部署后destroy方法未触发,反而执行show方法求助
Laravel 5.8 部署后Delete请求触发show方法而非destroy的问题解决
问题描述
使用Laravel 5.8 + PHP 7.4开发的项目,本地运行正常,但部署到服务器后,发送Delete请求到SellerController时,destroy方法未被触发,反而执行了show方法。相关路由及控制器代码如下:
web.php 路由配置
Route::group(['prefix' => 'admin', 'middleware' => 'auth', /*'middleware' => ['auth','administrator'] ,*/ 'namespace' => 'admin', 'as' => 'admin.'], function () { Route::resource('/sellers', 'SellerController'); });
SellerController 关键代码
class SellerController extends Controller { public function show(Request $request, $id) { return ['msg' => 'it is show method ']; } public function destroy(Request $request, $id) { if ($request->ajax()) { if ($request->user()->cannot('destroy', Seller::class)) { return ['error' => 'unauthorized']; } try { $teams = DB::table('team_user')->where('user_id', $id)->delete(); $deleted = $this->model_instance::findOrFail($id); $deleted->delete(); $deleted->name = " [archived] $deleted->name #$id"; $deleted->save(); if ($deleted) { $log_message = trans('sellers.delete_log') . '#' . $id; logActivity($log_message); return response()->json(['status' => 'success', 'message' => 'deleted_successfully']); } else { return response()->json(['status' => 'fail', 'message' => 'fail_while_delete']); } } catch (\Exception $ex) { DB::rollBack(); dd($ex->getMessage()); Log::error($ex->getMessage()); return redirect()->route($this->index_route)->with('error', $this->error_message); } } return redirect()->route($this->index_route); } }
问题原因及解决方案
1. 服务器Web服务器不支持PUT/DELETE请求,导致请求被解析为GET
Laravel依赖Web服务器支持的HTTP方法路由请求,部分服务器默认仅处理GET/POST,会把DELETE/PUT请求转为GET,从而触发show方法(show对应GET请求到/admin/sellers/{id})。
解决方法:
- AJAX请求场景:明确设置请求方法为
DELETE,并携带CSRF令牌:
$.ajax({ url: '/admin/sellers/' + id, type: 'DELETE', headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }, success: function(res) { // 处理响应逻辑 } });
- 表单提交场景:使用POST方法提交,添加隐藏字段
_method="DELETE":
<form action="/admin/sellers/{{ $seller->id }}" method="POST"> @csrf @method('DELETE') <button type="submit">删除</button> </form>
2. Web服务器重写规则配置错误
Laravel需要将所有请求转发到index.php才能正确解析路由,若重写规则失效,会导致请求方法解析错误。
解决方法:
- Apache服务器:确保项目根目录
.htaccess配置正确:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # 处理授权头 RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # 重定向尾部斜杠 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # 转发请求到index.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
同时确认Apache已启用mod_rewrite模块。
- Nginx服务器:在站点配置中添加重写规则:
location / { try_files $uri $uri/ /index.php?$query_string; }
3. Laravel路由缓存问题
服务器上若执行过php artisan route:cache,可能导致路由缓存过期或错误,无法正确匹配DELETE请求。
解决方法:
在服务器项目根目录执行以下命令清除缓存:
php artisan route:clear php artisan config:clear php artisan cache:clear
4. 验证请求实际方法
在show方法中添加日志,确认服务器收到的请求方法:
public function show(Request $request, $id) { \Log::info('Show method triggered with request method: ' . $request->method()); return ['msg' => 'it is show method ']; }
查看storage/logs/laravel.log,若显示请求方法为GET,说明服务器未正确处理DELETE请求,回到上述步骤排查。
内容的提问来源于stack exchange,提问作者Mohammad Al Hallaq
相关产品推荐
相关产品推荐

