错误405(方法未允许)Laravel 5。

47

我正在尝试使用jQuery进行POST请求,但是出现了错误405(方法不允许),我正在使用Laravel 5。

这是我的代码:

jQuery

<script type="text/javascript">
    $(document).ready(function () {
        $('.delete').click(function (e){
            e.preventDefault();
            var row = $(this).parents('tr');
            var id = row.data('id');
            var form = $('#formDelete');
            var url = form.attr('action').replace(':USER_ID', id);
            var data = form.serialize();
            $.post(url, data, function (result){
                alert(result);
            });
        });
    });
    </script>

HTML

{!! Form::open(['route' => ['companiesDelete', ':USER_ID'], 'method' =>'DELETE', 'id' => 'formDelete']) !!}

    {!!Form::close() !!}

控制器

public function delete($id, \Request $request){
        return $id;
    }

Jquery错误是http://localhost/laravel5.1/public/empresas/eliminar/5 405(方法不允许)。

网址值为

http://localhost/laravel5.1/public/empresas/eliminar/5

数据值为

_method=DELETE&_token=pCETpf1jDT1rY615o62W0UK7hs3UnTNm1t0vmIRZ.

如果我改用$.get请求,它可以正常工作,但我想要进行POST请求。

有人能帮我吗?

谢谢。

编辑!!

路由

Route::post('empresas/eliminar/{id}', ['as' => 'companiesDelete', 'uses' => 'CompaniesController@delete']);

1
请检查您的路由文件,您可能在路由中给出了一个GET方法,请尝试使用POST方法,它会起作用...... - Sagar Naliyapara
9个回答

57

methodNotAllowed异常表示您请求的HTTP方法没有对应的路由。

您的表单设置为进行DELETE请求,因此您的路由需要使用Route::delete()来接收它。

Route::delete('empresas/eliminar/{id}', [
        'as' => 'companiesDelete',
        'uses' => 'CompaniesController@delete'
]);

但他发起了一个ajax的post请求。这与表单方法有什么关系? - Čamo
这是一个POST请求,但op将包含method="delete"属性的表单数据进行序列化,并通过ajax进行提交。 - Jeemusu
我不明白。序列化只是一个字符串。 - Čamo
当您在Laravel中使用{!! Form :: open('method' => 'DELETE')!!}时,它会自动添加一个名为_method的隐藏输入,并赋予指定的值,本例中为DELETE。 Laravel会自动查找每个请求中的此参数,以确定它是DELETE,POST,PATCH还是GET请求。我建议阅读有关方法欺骗的Laravel文档。https://laravel.com/docs/5.0/routing#method-spoofing - Jeemusu
啊,我明白了。你说得对。我记不住所有的文档。 - Čamo
@Jeemusu 我有同样的问题,但在本地服务器上可以运行,在在线服务器上却无法正常工作,请你帮我一下,好吗? - Anas Hassan

9

您的routes.php文件需要正确设置。

我假设您当前的设置如下:

Route::post('/empresas/eliminar/{id}','CompanyController@companiesDelete');

或者其他什么。相反,为删除方法定义一个路由。
Route::delete('/empresas/eliminar/{id}','CompanyController@companiesDelete');

现在,如果您使用路由资源,则“DELETE”方法要使用的默认路由名称为.destroy。请在该函数中定义您的删除逻辑。

8

在我的情况下,我的路由器中的路由为:

Route::post('/new-order', 'Api\OrderController@initiateOrder')->name('newOrder');

我从客户端应用程序提交请求到以下地址:

https://my-domain/api/new-order/

因此,由于结尾处带有斜杠,我收到了405错误。希望对某些人有所帮助。


6

如果你在开发过程中没有遇到此类错误,并且它仅在生产环境中出现,请尝试执行

php artisan route:list 查看路由是否存在。

如果不存在,请尝试执行

php artisan route:clear 清除缓存。

这对我有用。


1
这解决了我的问题,谢谢! 使用 php artisan cache:clear 清除缓存没有帮助,而 php artisan route:clear 则解决了问题! - Stas Sorokin

4
这可能会帮助到其他人,所以我也会在这里提供我的意见。
我遇到了相同(或类似)的问题。显然,问题是POST请求被Modsec阻止了,由于以下规则:350147、340147、340148、350148。
在阻止请求后,我被重定向到相同的端点,但当然是GET请求,因此出现了405错误。
我将这些规则加入白名单,405错误就消失了。
希望这能帮助到别人。

2
谢谢!在我的情况下,是规则300016导致了阻塞。 - jeremyj11
在我的情况下,它是REQUEST-911-METHOD-ENFORCEMENT.conf规则。 - Victor Okech

3

如果你正在使用资源路由,那么在表单的HTML主体中,你可以像这样使用method_field助手

<form>
  {{ csrf_field() }}
  {{ method_field('PUT') }}
  <!-- ... -->
</form>

它将创建带有方法类型的隐藏表单输入,这是 Laravel 5.5+ 正确解释的。

自 Laravel 5.6 开始,您可以在模板中使用以下 Blade 指令:

<form>
  @method('put')
  @csrf
  <!-- ... -->
</form>

希望这能帮助未来有需要的人。

0

当在表单中使用delete方法时,必须设置路由为delete。

Route::delete("empresas/eliminar/{id}", "CompaniesController@delete");

-1

我通过运行php artisan route:cache来解决了这个问题,该命令清除了缓存并开始正常工作。


-2

对于 Laravel 7+,如果你遇到这个问题,你应该使用以下方法检查路由是否存在:

php artisan route:list

如果存在,则需要缓存您的路由。
php artisan route:cache

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接