Laravel API 节流
如果您的主要问题是机器人获取所有组合,那么节流中间件除了使用验证码之外,还会帮助您实现这一点。
默认情况下,您的所有 API 路由(在routes/api.php
) 每个 IP 每分钟最多允许 60 个请求。您可以根据自己的需要修改此金额app/Http/Kernel.php
通过更改文件throttle:api
部分:
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
将其更改为throttle:30:1
例如,这意味着您将允许每个 ip 每分钟 30 个请求。
如果您只想限制 api 上的某些路由,则可以在其他地方使用中间件:
Route::get('my-method', MyController::class)->middleware('throttle:30:1');
创建一个限制主机的中间件
如果您想按域精确限制,您正在寻找的可能是自定义中间件。中间件允许您检查各种请求属性(包括通过$request->getHost()
)并阻止任何控制器或方法。
虽然 Laravel 默认TrustHosts
中间件提供全局主机验证,您可以为特定路径创建自己的自定义中间件,如下所示:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class LocalOnly
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
if($request->getHost() != 'localhost')
{
return response('', 400);
}
return $next($request);
}
}
注意:如果您要创建新的中间件,则需要注册它们。 Laravel 有自己的指南here.
在此示例中,当在任何路由上使用时,Laravel 将拒绝除localhost
(所以即使127.0.0.1
会被拒绝)
就我个人而言,我不建议这样做,因为内置节流是一个更优雅的解决方案,但如果您确实需要这样做,就这样做吧。