Laravel 8 在尾部斜杠上行为不当

问题描述 投票:0回答:3

使用带有尾部斜杠的 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 .htaccess laravel-8 trailing-slash
3个回答
11
投票

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

并且只有不包含“客户”的链接才会被重定向。


0
投票

正如你所说,这是一条

api
路线,你应该这样称呼它:

api/user/register

如果您无法从移动设备更改它,您应该以这种方式从

api
路由中删除默认的
api
前缀:

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


0
投票

你可以发布你的路线文件吗?他们可能会犯一个小错误。我用一个非常简单的代码尝试了它,一切都按预期工作:

// 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 中的问题。

© www.soinside.com 2019 - 2024. All rights reserved.