php - 拉维尔 5.4 : POST API routes give MethodNotAllowedHttpException

标签 php laravel api

很奇怪,POST API 路由不起作用! 在 api.php 中检查这个简单的 POST 路由:

// This route doesn't work!
Route::post('/test', function (Request $request) {
        return 'test';
});

它给我这个错误:Symfony\\Component\\HttpKernel\\Exception\\MethodNotAllowedHttpException!

但是如果我将请求动词更改为 GET,那么 GET 和 POST 都可以正常工作!!!这让我发疯!

// This route works on both, GET and POST!
Route::get('/test', function (Request $request) {
        return 'test';
});

是的,如您所知,API 路由根本不使用 VerifyCsrfToken 中间件。所以中间件显然不是问题!而 php artisan cache:clear 也不是答案:(

有人遇到同样的问题吗?任何帮助将不胜感激。

最佳答案

哦耶!正如@patricus 在评论中也提到的那样,我在不知情的情况下试验了一个愚蠢的重定向!让我为遇到同样事情但不知道此问题出处的任何其他人澄清这一点!

您需要确保您要连接的 URL 不会在幕后被重定向...

例如在我自己的托管面板中,我已经设置为在我的所有 URL 中添加 WWW...所以当我尝试访问 https://example.com/app/public/api/test通过 POST 方法访问 URL,我遇到了 MethodNotAllowedHttpException 错误!因为我的 URL 被重定向到 https://www.example.com/app/public/api/test 并且在重定向中它会变成 GET!因为我没有设置任何 GET 路由...所以很明显我遇到了 MethodNotAllowedHttpException 异常 :)

这很愚蠢,对吧?是,我知道!还要确保如果您的应用位于 SSL 域中,请始终连接到 https:// 而不是 http://。因为它不仅安全,而且重定向可能会在您不知情的情况下再次发生!如何?通过您自己的 .htaccess 文件,您已更改或您的托管支持已为您更改了它但您不记得了(同时检查 this answer):

# Let's force using SSL on all of our URLs and also forbid non-secure POSTs

RewriteEngine On

# Forbid non-secure POSTs
RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_METHOD} =POST
RewriteRule ^ / [F,L]

# Force SSL
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

或通过 CloudFlare 等服务,如果您在 CloudFlare 面板中设置了此设置并再次将您的所有 URL 从 http:// 重定向到 https://不记得了!

关于php - 拉维尔 5.4 : POST API routes give MethodNotAllowedHttpException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47045215/

相关文章:

php - 简单的PHP数据库连接

php - 为什么 GlobIterator 产生的输出与 glob 函数不同?

java - Rest Api设计: resource archetypes,存储和 Controller

django - 第一次生成移动应用程序的 key 时,如何与服务器共享它?

api - Woocommerce 产品 api v3 不接受 9191 端口的 url 图像。仅8080

php header() 函数不会重定向

php - 通过 PHP 加载 Javascript

php - 关系不存在的 Laravel 搜索

php - 为什么我在 Laravel 中的简单属于关系不起作用?

php - Laravel 连接表并获得用户的最大订单