使用带有尾部斜杠的 API 时出现问题。
路线
Route::post('user/register','UserController@register');
当我从邮递员/网站调用此路线
POST
时,它工作正常,但我从移动设备上调用此路线,并带有如下所示的尾部斜杠。
user/register/
Laravel 默认情况下会删除尾部斜杠,但当我转储请求方法时将请求设为
GET
。
$method = $_SERVER['REQUEST_METHOD'];
$json = json_encode(['response' => $method], true);
result -> "{response : 'GET'}"
我无法获取请求正文。
注意:我尝试了很多解决方案但找不到任何解决方案,而且我无法从移动端删除或更新路由调用,所以我必须在服务器端处理它。
当 Laravel 检测到尾随斜杠时,它会返回 301 重定向到“无尾斜杠”版本。重定向的请求始终是“GET”,因此您将无法获取 POST 结果。
防止这种情况的唯一方法(假设您使用的是 Apache)是转到您的 .htaccess 文件(应位于 laravel 安装的公共目录中)并删除以下内容:
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
现在带有斜杠的 URL 将不再被重定向。
编辑:如果您只想阻止某些 URI 的重定向,则需要指定更严格的条件,而不是删除这些行。例如,要停止仅重定向包含“客户”的链接,您可以这样做:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !customer
RewriteRule ^ %1 [L,R=301]
并且只有不包含“客户”的链接才会被重定向。
正如你所说,这是一条
api
路线,你应该这样称呼它:
api/user/register
如果您无法从移动设备更改它,您应该以这种方式从
api
路由中删除默认的 api
前缀:
在
app\Providers\RouteServiceProvider
中将 Route::prefix('api')
更改为 Route::prefix('')
。
你可以发布你的路线文件吗?他们可能会犯一个小错误。我用一个非常简单的代码尝试了它,一切都按预期工作:
// routes/api.php
<?php
Route::post('/foo', function(Request $request) {
return new JsonResponse('post');
});
Route::get('/foo', function(Request $request) {
return new JsonResponse('get');
});
如果我使用 Postman 调用 GET API,无论带或不带尾部斜杠,都会返回“get”。如果我使用 Postman 调用 POST API,无论是否带有尾部斜杠,都会返回“post”。
问题也可能是由于您的移动应用程序配置不正确,而不是 Laravel 中的问题。