无法通过jquery Ajax在laravel 5中发布

Kie*_*Duy 9 php ajax jquery laravel laravel-5

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

我的routes.php:

Route::post('backend/get_subdirectories',  'Backend\FileManagerController@get_subdirectories');
Run Code Online (Sandbox Code Playgroud)

控制器

public function get_subdirectories(Request $request)
{
    dd($request);
}
Run Code Online (Sandbox Code Playgroud)

和脚本

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");
            });
Run Code Online (Sandbox Code Playgroud)

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

我错了什么?

Kir*_*chs 18

@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]
Run Code Online (Sandbox Code Playgroud)

现在真正的问题是,客户端将对301重定向指定的URL执行GET请求.

等待!它为什么会这样做?

那么,我们可以查看RFC7231的答案.它说

6.4.2.301永久移动

301(永久移动)状态代码表示已为目标
资源分配了新的永久URI,并且
此资源的任何将来引用都应使用其中一个附带的URI.
具有链接编辑功能的客户端应尽可能自动将对有效请求URI的引用重新链接到
服务器发送的一个或多个新引用.

服务器应该在响应中生成一个Location头字段,其中包含新永久URI的首选URI引用.该
用户代理可以使用自动位置字段值
重定向.服务器的响应有效负载通常包含一个短
超文本注释,其中包含指向新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.
Run Code Online (Sandbox Code Playgroud)

默认情况下,301响应可缓存; 即,除非
方法定义或显式缓存控制另有说明(参见
[RFC7234]的第4.2.2节).

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