You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 08:56:06