为防止网站或API被频繁请求或被DDoS攻击,需要设置请求限制,而Laravel刚好自带个Throttle中间件,使用起来也非常方便。
1. 需在App\Http\Kernel里加入配置 throttle:20,1,如下图
20代表请求次数,1代表每分钟,可以根据自身需求自行设置,设到满意为止。
这样其实就可以限制被频繁访问了,不过显示的429页面确实有点丑,感觉看不下去,如下图:
那如何改成好看点呢。
2. 只需要在App\Exceptions\Handler加入如下代码即可
/**
* Register the exception handling callbacks for the application.
*
* @return void
*/
public function register()
{
$this->reportable(function (Throwable $e) {
//
});
$this->renderable(function (Throwable $e) {
if ($e instanceof ThrottleRequestsException) {
$limitTime = $e->getHeaders()['Retry-After'];
$code = $e->getStatusCode();
return response()->view('error', ['time_limit'=>$limitTime], $code);
//假如ajax,可以用json返回//return response()->json([...]);
}
});
}
然后再看下效果,比之前好多了,界面可自行优化下。
还有个问题,那如果你只想限制游客,并不想限制登录用户,那又改怎么做呢?
3. 再App\Http\Kernel里替换掉原生的ThrottleRequests,再建一个新的覆盖即可,如下图:
ThrottleRequestsLimit的代码如下:
<?php
namespace App\Http\Middleware;
use Illuminate\Routing\Middleware\ThrottleRequests;
use Closure;
use Illuminate\Support\Facades\Auth;
class ThrottleRequestsLimit extends ThrottleRequests
{
protected function handleRequest($request, Closure $next, array $limits)
{
if (Auth::check()) {
//not limit auth userreturn $next($request);
} else {
return parent::handleRequest($request, $next, $limits);
}
}
}
当然laravel还有个RateLimiter可以用,下期再分享。