Laravel 8 在末尾斜杠处理上出了问题

15

在使用带有尾随斜杠的API时出现了问题。

路线

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

我在Postman/网站中调用这个路由的POST方法时运行良好,但是我从移动设备上使用以下带有尾部斜杠的路由调用它。

user/register/

Laravel默认会去除URL末尾的斜杠,但在我输出请求方法时却是使用GET方法。

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

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

我无法获取请求体。

注意:我尝试了许多解决方案,但没有找到任何解决方案,并且我不能从移动端删除或更新路由调用,因此我必须在服务器端处理它。


Route::post('user/register','UserController@register'); 这条路由是显示表单还是保存数据? - frogeyedman
这是一个API路由,它保存数据并返回响应。 - Muhammad Shareyar
当您在注册时将其设为“邮寄”时,无法仅使用移动电话“获取”路线。 - frogeyedman
他们实际上正在进行一个post请求,但是在末尾加了一个斜杠,而laravel会去掉这个斜杠,例如user/register/而不是user/register,并将其视为一个get请求。 - Muhammad Shareyar
3个回答

9

当Laravel检测到末尾有斜杠时,它将返回一个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的重定向,而不是删除这些行,那么你需要指定更严格的条件。例如,要停止仅重定向包含“customer”的链接,你需要这样做:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !customer
RewriteRule ^ %1 [L,R=301]

只有不包含“customer”的链接才会被重定向。


我可以针对特定的路由前缀进行检查吗?例如,如果路由有 customer/user/register,则不要检查尾随斜杠,否则按原样工作。 - Muhammad Shareyar

0

正如你所说,这是一个 api 路由,你应该这样调用它:

api/user/register

如果您无法从移动设备更改它,则应从api路由中删除默认的api前缀,方法如下:

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


我已经在上面提到过,我无法从移动端更改路由,因此我必须在服务器上处理它。 - Muhammad Shareyar
我有一个用于API的自定义路由文件,因此它没有使用 api 前缀。 - Muhammad Shareyar

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

他们正在使用 xxx-www-urlencoded-form 发送数据,因此当他们在调用带有尾随斜杠 / 的 API 时,Laravel 默认会删除尾随斜杠,并且我收到的方法操作是 GET,而且没有请求体。 - Muhammad Shareyar

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