Vercel Edge FunctionsでAIボットをブロックする方法
Vercel Edge Middlewareによるブロックのメリット
VercelでホストされたNext.jsアプリケーションでAIボットをブロックする最も効率的な方法は、Edge Middlewareを使うことです。
Edge Middlewareの利点:
- グローバルエッジ実行:ユーザーに最も近いエッジノードで処理されるため、オリジンサーバーへの負荷がゼロ
- レイテンシ最小化:判定処理が数ms以内で完了
- 全ルートに自動適用:一度設定すれば全ページに適用される
- デプロイ不要の更新:middleware.tsを変更するだけで即反映
基本実装:middleware.tsでAIボットをブロック
src/middleware.ts または middleware.ts
import { NextRequest, NextResponse } from "next/server";
const AI_BOT_PATTERN = /GPTBot|OAI-SearchBot|ClaudeBot|anthropic-ai|PerplexityBot|Google-Extended|Amazonbot|Bytespider|CCBot|cohere-ai|MistralBot|Diffbot/i;
export function middleware(req: NextRequest) {
const ua = req.headers.get("user-agent") ?? "";
if (AI_BOT_PATTERN.test(ua)) {
return new NextResponse(
JSON.stringify({ error: "AI crawlers are not permitted" }),
{
status: 403,
headers: { "Content-Type": "application/json" }
}
);
}
return NextResponse.next();
}
export const config = {
matcher: [
// 静的ファイルとAPIルートを除外
"/((?!_next/static|_next/image|favicon.ico|api/).*)",
],
};
高度な実装:Check APIと連携した判定
AI Access MonitorのCheck APIを使えば、パターンマッチングよりも精度の高い判定ができます:
import { NextRequest, NextResponse } from "next/server";
// 高速な事前フィルタ(明らかなボットを即ブロック)
const OBVIOUS_BOT_PATTERN = /GPTBot|ClaudeBot|PerplexityBot|Amazonbot|Bytespider/i;
export async function middleware(req: NextRequest) {
const ua = req.headers.get("user-agent") ?? "";
const siteId = process.env.MONITOR_SITE_ID ?? "";
// 明らかなボットは即座にブロック(レイテンシ最小化)
if (OBVIOUS_BOT_PATTERN.test(ua)) {
return new NextResponse(null, { status: 403 });
}
// グレーゾーンのUAはCheck APIで判定(Proプランのみ推奨)
// Edge Runtimeからの外部API呼び出しはタイムアウトに注意
return NextResponse.next();
}
export const config = {
matcher: ["/((?!_next|favicon.ico).*)"],
};
robots.txtをEdge Functionで動的生成
// app/robots.ts (Next.js 13.3+ App Router)
import { MetadataRoute } from "next";
export default function robots(): MetadataRoute.Robots {
return {
rules: [
// AIクローラーをすべてブロック
{
userAgent: "GPTBot",
disallow: "/",
},
{
userAgent: "OAI-SearchBot",
disallow: "/",
},
{
userAgent: "ClaudeBot",
disallow: "/",
},
{
userAgent: "anthropic-ai",
disallow: "/",
},
{
userAgent: "PerplexityBot",
disallow: "/",
},
{
userAgent: "Google-Extended",
disallow: "/",
},
{
userAgent: "Amazonbot",
disallow: "/",
},
{
userAgent: "Bytespider",
disallow: "/",
},
{
userAgent: "CCBot",
disallow: "/",
},
{
userAgent: "Applebot-Extended",
disallow: "/",
},
// 通常の検索エンジンは許可
{
userAgent: "*",
allow: "/",
},
],
sitemap: "https://yourdomain.com/sitemap.xml",
};
}
Vercel Firewall Rules(有料プラン)
Vercel ProプランではFirewall Rulesも利用できます:
// vercel.json
{
"firewall": {
"rules": [
{
"name": "Block AI Bots",
"description": "Block known AI training crawlers",
"conditionGroup": [
{
"conditions": [
{
"type": "user_agent",
"op": "re",
"value": "GPTBot|ClaudeBot|PerplexityBot|Amazonbot|Bytespider"
}
]
}
],
"action": {
"type": "block"
}
}
]
}
}
Edge Middlewareでのパフォーマンス最適化
Edge Middlewareはリクエストごとに実行されるため、処理を最小限にすることが重要です:
- 正規表現はコンパイル済みを使う:モジュールレベルで定義し、毎リクエスト再コンパイルしない
- 外部API呼び出しを避ける:Edge Runtimeの実行時間制限(通常1〜5秒)に注意
- 早期リターン:ボット検知したら即座に返す
VercelデプロイとAI Access Monitorの組み合わせ
Vercel上のNext.jsサイトにAI Access Monitorを設置すると、Middlewareでブロックしたアクセスも含めてAIボットの全体像を把握できます。
VercelへのデプロイはGitHub連携で自動化できます。AI Access Monitorを無料で試す →