Laravel 8 尾部斜杠行为不当

Laravel 8 misbehaves on trailing slash

使用带尾部斜杠的 API 时出现问题。

路线

Route::post('user/register','UserController@register');

当我从 postman/website 调用此路由 POST 时它工作正常,但我从移动设备调用此路由时带有如下所示的尾部斜线。

user/register/

Laravel,默认情况下,删除尾部斜杠,但在转储请求方法时将请求设为 GET

$method = $_SERVER['REQUEST_METHOD'];
$json = json_encode(['response' => $method], true);

result  -> "{response : 'GET'}"

而且我无法获取请求正文。

注意:我试过很多解决方案都没有找到解决方案,而且我无法删除或更新从移动端调用的路由,所以我必须在服务器端处理。

正如你所说,这是一条 api 路线,你应该这样称呼它:

api/user/register

如果您无法从移动设备更改它,您应该通过这种方式从 api 路由中删除默认 api 前缀:

app\Providers\RouteServiceProvider 中将 Route::prefix('api') 更改为 Route::prefix('')

当 Laravel 检测到尾部斜线时,它 returns 301 重定向到“未尾部斜线”版本。重定向的请求始终是 'GET',因此您将无法获得 POST 结果。

防止这种情况的唯一方法(假设您使用的是 Apache)是转到您的 .htaccess 文件(应该在 laravel 安装的 public 目录中)并删除以下内容:

# 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]

并且只有在任何地方都不包含“客户”的链接才会被重定向。

你能post你的路由文件吗?他们可能有一个小错误。我用一个非常简单的代码试了一下,一切都按预期工作:

// 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”。如果我调用 POST API 带或不带尾部斜杠的 Postman,则返回“post”。

问题也可能来自您的移动应用程序未正确配置,而不是 Laravel 中的问题。