应为内外api设置差异化限流策略:内部调用通过x-internal-secret识别并免限流,外部按认证状态分层限频(已认证用户按角色配额、游客严格限频),并通过中间件顺序与json响应适配确保策略生效。

你需要为内部调用系统(如微服务间通信)和外部公开API(如移动端、第三方接入)设置完全不同的请求频率限制策略,避免内部高频调用被误限,同时防止外部接口被恶意刷量。
区分内外流量的底层识别逻辑
第一步:在 app/Http/Middleware/IdentifyApiOrigin.php 中创建中间件,拦截所有 API 请求并打标。
第二步:检查请求头中是否携带 X-Internal-Secret,该 header 由内部服务统一注入,值为预共享密钥;若匹配则设置 $request->attributes->set('api_origin', 'internal')。
第三步:若未匹配,则 fallback 到检查 Authorization: Bearer xxx 是否存在且通过 Sanctum 验证——存在且有效即为外部已认证用户;否则标记为 external_guest。
【关键前提】 必须确保内部服务调用时始终携带 X-Internal-Secret,且该密钥不暴露于任何前端或日志中。漏掉这一步会导致所有请求都被当作外部流量处理。
配置命名限流策略:内部不限频,外部分层控频
打开 app/Providers/RouteServiceProvider.php,在 configureRateLimiting() 方法内注册三个策略:
方法一:内部 API 免限流
RateLimiter::for('internal', function (Request $request) { return Limit::perMinute(9999)->by($request->ip()); });
方法二:外部已认证用户按角色配额
RateLimiter::for('external_auth', function (Request $request) { $role = $request->user()?->role ?? 'basic'; return match($role) { 'admin' => Limit::perMinute(1000), 'premium' => Limit::perMinute(500), default => Limit::perMinute(100) }; });
方法三:外部游客严格限频
RateLimiter::for('external_guest', function (Request $request) { return Limit::perMinute(5)->by($request->ip()); });
路由分组绑定对应限流中间件
第一步:在 routes/api.php 中定义内部路由组,显式应用 internal 策略
Route::middleware(['api', 'identify-origin', 'throttle:internal'])->prefix('internal')->group(function () { Route::get('/health', [HealthController::class, 'check']); Route::post('/sync', [SyncController::class, 'push']); });
第二步:定义外部路由组,按请求属性动态选择策略
Route::middleware(['api', 'identify-origin'])->prefix('v1')->group(function () { Route::middleware(function ($request, $next) { $origin = $request->attributes->get('api_origin', 'external_guest'); return $next($request)->withHeaders([ 'X-Api-Origin' => $origin ]); })->group(function () { Route::middleware('throttle:external_auth')->group(function () { Route::get('/users/{id}', [UserController::class, 'show']); }); Route::middleware('throttle:external_guest')->group(function () { Route::post('/register', [AuthController::class, 'register']); }); }); });
第三步:确保 identify-origin 中间件已在 app/Http/Kernel.php 的 $middlewareGroups['api'] 中注册,位置必须在 throttle 之前——否则 $request->attributes 还未写入,限流策略无法读取 origin 标识。
强制响应 JSON 格式并暴露限流头
创建 app/Http/Middleware/EnsureJsonThrottleResponse.php,继承 ThrottleRequests,重写 buildResponse() 方法:
protected function buildResponse($key, $maxAttempts) { $retryAfter = $this->calculateRetryAfter($key); return response()->json([ 'error' => 'Too many requests', 'retry_after' => $retryAfter ], 429)->header('Retry-After', $retryAfter)->header('X-RateLimit-Limit', $maxAttempts)->header('X-RateLimit-Remaining', 0); }
将此中间件替换 Kernel.php 中默认的 ThrottleRequests::class,仅用于 API 组。
【不可逆操作】 替换后,所有 API 限流响应将不再返回 HTML 页面,前端必须能正确解析 JSON 和 429 状态码,否则会触发未知错误。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











