Cloudflare 速查表
本文档提供 Cloudflare 常用命令、配置和代码片段的快速参考。
DNS 记录类型
| 类型 | 用途 | 示例 |
|---|---|---|
| A | 指向 IPv4 地址 | @ → 192.0.2.1 |
| AAAA | 指向 IPv6 地址 | @ → 2001:db8::1 |
| CNAME | 指向另一个域名 | www → example.com |
| MX | 邮件服务器 | @ → mail.example.com |
| TXT | 文本记录 | SPF、验证等 |
| NS | 域名服务器 | @ → ns1.cloudflare.com |
SSL/TLS 模式
| 模式 | 用户→CF | CF→源站 | 适用场景 |
|---|---|---|---|
| Flexible | HTTPS | HTTP | 源站无证书 |
| Full | HTTPS | HTTPS | 源站有自签名证书 |
| Full (Strict) | HTTPS | HTTPS + 验证 | 生产环境推荐 |
Wrangler 常用命令
认证与配置
# 登录
wrangler login
# 查看当前用户
wrangler whoami
# 初始化项目
npm create cloudflare@latest my-project
Workers 操作
# 本地开发
npx wrangler dev
# 部署
npx wrangler deploy
# 查看日志
npx wrangler tail
# 查看部署列表
npx wrangler deployments list
KV 操作
# 创建命名空间
npx wrangler kv:namespace create MY_KV
# 写入数据
npx wrangler kv:key put --binding=MY_KV "key" "value"
# 读取数据
npx wrangler kv:key get --binding=MY_KV "key"
# 列出键
npx wrangler kv:key list --binding=MY_KV
# 删除数据
npx wrangler kv:key delete --binding=MY_KV "key"
R2 操作
# 创建存储桶
npx wrangler r2 bucket create my-bucket
# 列出存储桶
npx wrangler r2 bucket list
# 上传文件
npx wrangler r2 object put my-bucket/file.txt --file=./local-file.txt
# 下载文件
npx wrangler r2 object get my-bucket/file.txt --file=./local-file.txt
# 删除文件
npx wrangler r2 object delete my-bucket/file.txt
D1 操作
# 创建数据库
npx wrangler d1 create my-database
# 列出数据库
npx wrangler d1 list
# 执行 SQL 文件
npx wrangler d1 execute my-database --file=./schema.sql
# 执行单条 SQL
npx wrangler d1 execute my-database --command "SELECT * FROM users"
# 导出数据
npx wrangler d1 export my-database --output=backup.sql
Pages 操作
# 部署静态站点
npx wrangler pages deploy ./dist
# 指定项目名称
npx wrangler pages deploy ./dist --project-name=my-site
# 本地开发
npx wrangler pages dev ./dist
Tunnel 操作
# 登录
cloudflared tunnel login
# 创建隧道
cloudflared tunnel create my-tunnel
# 列出隧道
cloudflared tunnel list
# 运行隧道
cloudflared tunnel run my-tunnel
# 配置 DNS
cloudflared tunnel route dns my-tunnel subdomain.example.com
# 删除隧道
cloudflared tunnel delete my-tunnel
Workers 代码片段
基本结构
export default {
async fetch(request, env, ctx) {
return new Response('Hello World!');
},
};
JSON 响应
return Response.json({ message: 'Hello', data: [] });
路由处理
const url = new URL(request.url);
const path = url.pathname;
if (path === '/api/users') {
return handleUsers(request, env);
}
KV 操作
// 写入
await env.MY_KV.put('key', 'value');
await env.MY_KV.put('key', JSON.stringify(data));
// 读取
const value = await env.MY_KV.get('key');
const data = await env.MY_KV.get('key', 'json');
// 删除
await env.MY_KV.delete('key');
// 列出
const result = await env.MY_KV.list({ prefix: 'user:' });
R2 操作
// 上传
await env.MY_BUCKET.put('file.txt', fileContent, {
httpMetadata: { contentType: 'text/plain' }
});
// 下载
const object = await env.MY_BUCKET.get('file.txt');
const content = await object.text();
// 删除
await env.MY_BUCKET.delete('file.txt');
// 列出
const result = await env.MY_BUCKET.list();
D1 操作
// 查询所有
const result = await env.DB.prepare(
'SELECT * FROM users'
).all();
// 参数化查询
const user = await env.DB.prepare(
'SELECT * FROM users WHERE id = ?'
).bind(1).first();
// 插入
const result = await env.DB.prepare(
'INSERT INTO users (name, email) VALUES (?, ?)'
).bind('John', '[email protected]').run();
// 批量操作
await env.DB.batch([
env.DB.prepare('INSERT INTO users (name) VALUES (?)').bind('A'),
env.DB.prepare('INSERT INTO users (name) VALUES (?)').bind('B'),
]);
CORS 处理
const corsHeaders = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type',
};
if (request.method === 'OPTIONS') {
return new Response(null, { headers: corsHeaders });
}
return new Response('Hello', { headers: corsHeaders });
缓存
const cache = caches.default;
const cached = await cache.match(request);
if (cached) {
return cached;
}
const response = await fetch(request);
ctx.waitUntil(cache.put(request, response.clone()));
return response;
Pages 配置
_redirects 文件
# 重定向
/old /new 301
# SPA 路由
/* /index.html 200
# 代理
/api/* https://api.example.com/:splat 200
_headers 文件
/*
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
/assets/*
Cache-Control: public, max-age=31536000
wrangler.toml 配置
name = "my-worker"
main = "src/index.ts"
compatibility_date = "2024-01-01"
account_id = "your-account-id"
[vars]
ENVIRONMENT = "production"
[triggers]
crons = ["0 * * * *"]
[[kv_namespaces]]
binding = "MY_KV"
id = "your-kv-id"
[[r2_buckets]]
binding = "MY_BUCKET"
bucket_name = "my-bucket"
[[d1_databases]]
binding = "DB"
database_name = "my-database"
database_id = "your-database-id"
常用 HTTP 状态码
| 状态码 | 说明 | Cloudflare 场景 |
|---|---|---|
| 200 | 成功 | 正常响应 |
| 301 | 永久重定向 | URL 重定向 |
| 302 | 临时重定向 | 临时跳转 |
| 400 | 请求错误 | 无效请求 |
| 403 | 禁止访问 | WAF 拦截 |
| 404 | 未找到 | 资源不存在 |
| 429 | 请求过多 | 速率限制 |
| 500 | 服务器错误 | 源站错误 |
| 502 | 网关错误 | 源站不可达 |
| 503 | 服务不可用 | 维护中 |
| 504 | 网关超时 | 源站超时 |
缓存状态码
| 状态 | 说明 |
|---|---|
| HIT | 缓存命中 |
| MISS | 缓存未命中 |
| EXPIRED | 缓存过期 |
| STALE | 过期但仍返回 |
| BYPASS | 绕过缓存 |
| REVALIDATED | 已重新验证 |
Cloudflare IP 范围
获取 Cloudflare IP 列表:
# IPv4
curl https://www.cloudflare.com/ips-v4
# IPv6
curl https://www.cloudflare.com/ips-v6
常用公共 DNS
| 服务商 | IPv4 | IPv6 |
|---|---|---|
| Cloudflare | 1.1.1.1, 1.0.0.1 | 2606:4700:4700::1111 |
| 8.8.8.8, 8.8.4.4 | 2001:4860:4860::8888 | |
| Quad9 | 9.9.9.9 | 2620:fe::fe |