站点地图 & SEO 资源输出
所有 <loc> 指向 https://axionserve.com(env SITE_ORIGIN 可改)。主站将下列路径原样代理即获得同域有效 sitemap —— 搜索引擎只需提交主站 /sitemap.xml。本主机 robots.txt 已全站 Disallow,不与主站争收录。
ARTICLE_URL_PATTERN(默认 /{category}/{slug},占位符 {slug} {category})· COURSE_URL_PATTERN(默认 /academy/{slug})· SITEMAP_BILINGUAL=1 时动态内容追加 /en 双语 URL · SITEMAP_STATIC_PAGES 覆盖静态清单(格式 path:priority:changefreq,…)。主站集成指南(axionserve.com)
推荐 BFF 模式:主站 Worker 服务端调用本 API 渲染 HTML(SEO 最优、后端隐藏)。浏览器直连亦可 —— axionserve.com / portal.axionserve.com / localhost:5173 已在 CORS 白名单(含 credentials,可用 ALLOWED_ORIGINS 扩展)。
A · 代理 sitemap 到主站(即插即用,同域生效)
// axionserve-site Worker:原样代理门户 sitemap(同域生效)
const PORTAL = "https://axionserve-portal.aeronest-global.workers.dev";
const SEO_PATHS = ["/sitemap.xml", "/sitemap-pages.xml",
"/sitemap-articles.xml", "/sitemap-courses.xml"];
if (SEO_PATHS.includes(url.pathname)) {
const r = await fetch(PORTAL + url.pathname);
return new Response(await r.text(), {
headers: { "content-type": "application/xml; charset=utf-8",
"cache-control": "public, max-age=3600" }
});
}B · 调用内容渲染页面(列表 / 详情 / 学院)
// 服务端取内容(BFF);浏览器直连同样可用(CORS 白名单)
const PORTAL = "https://axionserve-portal.aeronest-global.workers.dev";
// 列表页 /articles(或按分类 /security、/products …)
const list = await (await fetch(
PORTAL + "/api/articles?category=articles&page=1&limit=12"
)).json();
// → { items:[{slug,title,summary,cover_image,tags,author,
// view_count,featured,published_at,category_slug,…}],
// total, page, limit, total_pages }
// 详情页 /{category}/{slug} —— 渲染 article.content(发布后自动进 sitemap)
const article = await (await fetch(PORTAL + "/api/articles/" + slug)).json();
// 学院:课程列表 / 详情(含 lessons 摘要) / 章节全文
const courses = await (await fetch(PORTAL + "/api/courses")).json();
const course = await (await fetch(PORTAL + "/api/courses/" + slug)).json();
const lesson = await (await fetch(PORTAL + "/api/courses/" + slug + "/lessons/" + id)).json();/robots.txt 已声明 Sitemap: https://axionserve.com/sitemap.xml —— 完成代理 A 后无需再改 robots。产品页(/products/*)由主站自有数据生成,建议保留在主站侧合并;发布/更新文章后本层缓存 ≤20s 自动刷新,sitemap ≤1h(管理写入会主动清理)。快速调用
所有公开端点无需鉴权,返回 UTF-8 JSON。管理端点接受三种凭据:axs_* 控制台会话(POST /api/admin/login 密码换取)、axn_* 作用域 API 密钥(Agent 用)、ADMIN_TOKEN 主密钥。站点首页 / 为后台控制台(密码登录);/sitemap.html 为内容输出页。
curl "https://AXION_HOST/api/articles?page=1&limit=12"
# → {"items":[…],"total":42,"page":1,"limit":12,"total_pages":4}
# 管理写入
curl -X POST "https://AXION_HOST/api/admin/articles" \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title":"Hello Edge","content":"...","category":"articles"}'端点参考
点击任意端点展开参数说明与实时调试台。GET 请求可直接在浏览器内试跑。
错误契约
全部错误统一为 JSON 信封,携带机器可读 code 与可追踪 requestId。
{
"error": "文章不存在", // 人类可读(zh-CN)
"code": 40401, // 机器可读:HTTP状态×100+序号
"requestId": "6f9d0…" // 报障时提供此 ID 可精确定位日志
}| HTTP | code | 含义 |
|---|---|---|
| 400 | 40001–40027 | 参数校验失败(字段级提示) |
| 401 | 40100 | 未携带 Bearer Token |
| 403 | 40300–40304 | 密钥无效 / 权限范围不足(40301) / 爬虫拦截(40302) / 密码错误(40303) / 会话过期(40304) |
| 404 | 40400–40406 | 资源不存在 |
| 405 | 40500 | 方法不允许(含 Allow 头) |
| 409 | 40900–40905 | 唯一约束冲突(slug/symbol/令牌重复) |
| 413 / 415 | 41300 / 41500 | 请求体超 2MB / Content-Type 非 JSON |
| 429 | 42900–42902 | 触发限速(含 Retry-After 头) |
| 500 / 503 | 50000+ / 50301 | 内部错误 / 存储绑定缺失 |
限速与缓存
边缘缓存
公开 GET 命中 Cache API:文章列表 20s、行情 15s、文章/课程详情与分类 60s(均带 SWR 兜底);文档页 300s。X-Axion-Cache: HIT/STALE/MISS/BYPASS 可视化命中状态,ETag 支持 304,管理写入后自动清理本节点缓存。
限速
每 IP 滑窗:公开 300 req/min,管理 60 req/min,写入 60 req/min,认证失败 15 req/min。触发返回 429 + Retry-After。可用环境变量 RATE_LIMIT_* 覆盖。
自愈 Schema
D1 查询失败自动触发幂等迁移(建表/补列)并重试一次。也可显式调用 POST /api/admin/migrate。
可观测
每个响应携带 X-Request-Id 与 X-Axion-Latency-Ms;5xx 输出结构化 JSON 日志,客户端永不泄漏堆栈。
架构特性
全球边缘
单文件 Worker 部署于 300+ 城市节点,就近响应,无冷启动惩罚。
纵深防御
恒定时间令牌比较、参数化 SQL、LIKE 通配符转义、CORS 域名白名单(axionserve.com 等 + ALLOWED_ORIGINS 可扩展)、CSP、全套安全响应头。
零依赖
不依赖任何 npm 包与构建工具,可粘贴至 Dashboard 直接部署。
契约稳定
v1 全部端点的路径、参数与响应形态逐字保留(含信封结构、404 文案、401/403 语义);新增字段仅做增量。