无法在 jquery Ajax 上的 laravel 5 中发布


Can not post in laravel 5 over jquery Ajax

我正在尝试在Laravel 5.1应用程序中通过jquery Ajax发送POST请求。我得到了 405 方法不允许,我正在此论坛上搜索其他问题,但找不到解决方案:

我的routes.php

Route::post('backend/get_subdirectories',  'Backend'FileManagerController@get_subdirectories');

控制器

public function get_subdirectories(Request $request)
{
    dd($request);
}

和脚本

var _token = $('meta[name="csrf-token"]').attr('content');
console.log(_token); //It work, I can get my token from meta tag
$.post(
            'http://domain.com/backend/get_subdirectories/',
            { _token: _token},
            function () {
                alert("success");
            })
            .fail(function () {
                alert("error");
            })
            .always(function () {
                alert("finished");
            });

我收到错误 405 - 方法不允许

我错了什么?

@Chris的评论是正确的:)

您只需从网址末尾删除/即可。您的 ajax 请求应转到 http://domain.com/backend/get_subdirectories

原因是,因为在public/.htaccess文件中,它将 301 将所有带有尾部斜杠的 url 重定向到没有斜杠的同一 URL。执行此操作的代码在这里:

# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

现在真正的问题是,客户端将向 301 重定向指定的 URL 发出 GET 请求。

等!为什么要这样做???

好吧,我们可以从RFC7231那里寻找答案。它说

6.4.2. 301 永久移动

301(永久移动)状态代码表示目标
资源已被分配一个新的永久 URI 和任何未来的
对此资源的引用应使用随附的 URI.
具有链接编辑功能的客户端应自动重新链接对有效请求 URI 的引用到一个或多个 new
在可能的情况下,服务器发送的引用。

服务器应在响应中生成位置标头字段包含新永久 URI 的首选 URI 引用。 用户代理可以将"位置"字段值用于 automatic
重定向。 服务器的响应有效负载通常包含一个短
带有指向新 URI 的超链接的超文本注释。

  Note: For historical reasons, a user agent MAY change the request
  method from POST to GET for the subsequent request.  If this
  behavior is undesired, the 307 (Temporary Redirect) status code
  can be used instead.

默认情况下,301 响应是可缓存的;即,除非另有
由方法定义或显式缓存控件指示 (请参阅
[RFC7234]的第 4.2.2 节)。

现在有趣的是底部的注释,它指定用户代理可以将请求方法从 POST 更改为 GET。似乎从浏览器到框架的大多数用户代理似乎都遵循该规则。