Laravel 5.4:POST API路由出现MethodNotAllowedHttpException错误

3

很奇怪,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也不是答案 :(

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


1
可能听起来有点疯狂,但如果您的请求中存在尾部斜杠,请尝试将其删除,因此不要使用http://foo.dev/test/,而是使用http://foo.dev/test - ntzm
是的,这很疯狂...我也搜索过,还有其他人遇到了这个问题!但是迄今为止没有人能提出解决方案...而且也没有尾随斜杠。 - Ali
你是如何调用 API 的?使用 Postman、ajax 还是其他工具? - Alex Harris
@AlexHarris 我正在使用POST方法在Postman上调用我的API,URL类似于:https://example.com/app/public/api/test。所以你可以看到我已经在使用https://... 你能否进一步解释一下?你的意思是什么? - Ali
2
听起来像是你遇到了重定向。如果你POST到一个url,它返回一个301/302重定向,那么对被重定向的url的后续请求将会是一个GET请求。这就是为什么你的POST路由不起作用,而POST到你的GET路由却起作用的原因。你需要弄清楚是什么导致了重定向。你可以更新你的问题,附上你的.htaccess内容,以及你正在访问的url或Postman截图。 - patricus
显示剩余4条评论
1个回答

4

哦耶!正如评论中@patricus所提到的,我正在进行一个愚蠢的重定向实验而不知道它!让我为任何其他遇到相同问题并且不知道问题来源的人做个解释!

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

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

这很愚蠢,对吧?是的,我知道!另外,请确保如果您的应用程序位于SSL域上,则始终连接到https://而不是http://。因为这不仅安全,而且可能会再次发生重定向,而您却不知道!怎么做?通过您自己的.htaccess文件,您已经更改或者您的托管支持已经为您更改,而您不记得了(也可以查看此答案):

# 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://,而您又不需要记住这个设置!


你救了我的一天,谢谢。 - Rajnish Mishra
谢谢,伙计。你的话“你需要确保你连接的URL不会被后台重定向...”救了我的一天!我一直在想为什么我的代码在本地开发服务器上可以运行,但在生产服务器上却不能运行。 - imin

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