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

Muh*_*yar 11 api .htaccess trailing-slash laravel laravel-8

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

路线

Route::post('user/register','UserController@register');
Run Code Online (Sandbox Code Playgroud)

当我POST从邮递员/网站调用此路由时,它工作正常,但我从移动设备调用了此路由,并带有如下斜杠。

user/register/
Run Code Online (Sandbox Code Playgroud)

默认情况下,Laravel 删除尾部斜杠,但GET在我转储请求方法时发出请求。

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

result  -> "{response : 'GET'}"
Run Code Online (Sandbox Code Playgroud)

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

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

Jos*_*ata 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]
Run Code Online (Sandbox Code Playgroud)

现在,带有斜杠的 URL 将不再被重定向。

编辑:如果您只想阻止某些 URI 的重定向,则需要指定更严格的条件,而不是删除这些行。例如,要停止仅重定向包含“customer”的链接,您可以这样做:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !customer
RewriteRule ^ %1 [L,R=301]
Run Code Online (Sandbox Code Playgroud)

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