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

Posted

技术标签:

【中文标题】无法通过 jquery Ajax 在 laravel 5 中发布【英文标题】:Can not post in laravel 5 over jquery Ajax 【发布时间】:2016-06-04 14:20:34 【问题描述】:

我正在尝试在 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 - 方法不允许

我错了什么?

【问题讨论】:

是不是url末尾的斜线/ @Chris:我不这么认为 你试过没有?您是否在同一个域上尝试此请求? php artisan route:list 的输出是什么? 你的开发者工具有什么错误? 【参考方案1】:

@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 的引用 尽可能由服务器发送的引用。

服务器应该在响应中生成一个 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.

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

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

【讨论】:

谢谢 Kirill Fuchs,你是专家

以上是关于无法通过 jquery Ajax 在 laravel 5 中发布的主要内容,如果未能解决你的问题,请参考以下文章

jquery-无法从我通过ajax调用获得的对象类型响应中检索数据

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

错误:通过 ajax jquery 加载数据时无法读取未定义的属性“样式”

为啥提交ajax请求时请求随机为空?

jQuery 无法处理 AJAX 加载的 html 内容

Jquery通过ajax发布数组