Laravel 5.8 - 每个 IP 的速率限制

Cra*_*vid 4 php laravel laravel-5

我使用 Laravel 5.8 来提供一个启用了标准节流的 API:

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
Run Code Online (Sandbox Code Playgroud)

我认识到此速率限制不适用于特定 IP。取而代之的是,它的作用类似于公共路线上的“全局”节流。

有什么我忽略的还是预期的行为?

如果这是预期的 - 如何在我的路由上启用“每个 IP”的速率限制?

cee*_*yoz 14

我认识到此速率限制不适用于特定 IP。取而代之的是,它的作用类似于公共路线上的“全局”节流。

这是不正确的。

https://github.com/laravel/framework/blob/5.8/src/Illuminate/Routing/Middleware/ThrottleRequests.php#L94

protected function resolveRequestSignature($request)
{
    if ($user = $request->user()) {
        return sha1($user->getAuthIdentifier());
    }

    if ($route = $request->route()) {
        return sha1($route->getDomain().'|'.$request->ip());
    }

    throw new RuntimeException('Unable to generate the request signature. Route unavailable.');
}
Run Code Online (Sandbox Code Playgroud)

仔细看看这两个if陈述。如果用户在场,则油门键基于他们的用户标识符。如果用户存在,则标识符包括$request->ip()。来自不同 IP 地址的请求进入不同的限制桶。

  • @Crack_David 我对 CloudFlare 没有太多个人经验,但很可能您是根据 CloudFlare 的 IP 而不是个人用户的 IP 进行速率限制。CloudFlare 发送带有真实 IP 的标头;您必须为“$request->ip()”[配置可信代理设置](https://laravel.com/docs/5.8/requests#configuring-trusted-proxies)才能理解它们。 (3认同)