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 中的问题。
使用带尾部斜杠的 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 中的问题。