URL 健康检查清单:上线前必须验证的 50+ 个项目
面向开发、SEO 与运维团队的 URL 上线检查清单,覆盖状态码、重定向、canonical、hreflang、缓存、安全与持续监控。
页面在浏览器里“能打开”,并不代表 URL 已经健康。一个公开 URL 同时承担路由、缓存、搜索索引、分享、监控和安全边界等职责。上线前漏掉一个状态码或规范化细节,往往会在流量增长、域名迁移或多语言扩展后放大。
下面的清单适合新页面发布、网站改版、域名迁移、CDN 切换和大规模路由调整。建议把它转化为自动化发布门禁,而不是只在故障发生后手工检查。
一、可访问性与状态码
- 首选 URL 返回 200,而不是 3xx、软 404 或错误页
- 不存在 5xx、连接超时和 TLS 握手失败
- 不需要登录的页面不会意外返回 401 或 403
- 被删除资源返回 404 或 410,而不是带错误文案的 200
- 限流响应使用 429,并在适当场景返回
Retry-After
状态码应与页面真实状态一致。监控系统、API 客户端和搜索引擎无法可靠理解一个“状态 200、正文却写着页面不存在”的响应。
完整状态码说明可查看HTTP 状态码指南。
二、URL 规范化
- HTTP 统一跳转到 HTTPS
- www 与非 www 只保留一个首选版本
- 尾斜杠策略全站一致
- 路径大小写规则明确
- 默认首页文件不会产生
/index.html等重复入口 - 不必要的追踪参数不会形成独立规范页面
- percent-encoding 不会让同一路径出现多个写法
所有非首选版本都应直接跳到最终地址,不要依赖多级链路逐步修正协议、域名和路径。
三、重定向
- 永久迁移使用 301 或 308
- 临时活动和维护流程使用 302 或 307
- 每个旧地址最多一次跳到最终页面
- 不存在循环或自重定向
- 查询参数按业务规则保留,而不是全部丢弃或无限追加
- 桌面、移动端和爬虫身份不会收到冲突的目标
运行 URL 重定向检查时,应同时记录原始 URL、每一跳耗时、状态码和最终地址。复杂问题可参考重定向链排查指南。
四、canonical 与索引控制
- 可索引页面包含唯一、绝对地址的 canonical
- canonical 指向返回 200 的页面
- canonical 与重定向、站内链接、sitemap 使用同一 URL
- 不应索引的页面使用
noindex - robots.txt 没有阻止搜索引擎读取需要识别
noindex或 canonical 的页面 - 分页、筛选和参数页有明确的索引策略
canonical 是规范化信号,不是重定向,也不是访问控制。若两个版本长期同时返回 200、互相矛盾地 self-canonical,搜索引擎仍需自行判断首选地址。
五、多语言与 hreflang
-
<html lang>与正文语言一致 - hreflang 使用有效的 BCP 47 标签,例如
zh-CN、en-US - 每个语言版本包含自引用和双向引用
-
x-default指向默认语言或语言选择页 - alternate 地址真实存在且允许索引
- canonical 留在当前语言版本,而不是统一指向英文页
只翻译导航和按钮、正文仍大量使用另一种语言,通常不能形成高质量的本地化页面。日期、货币、示例和搜索意图也应随语言市场调整。
六、响应头、缓存与内容协商
- HTML 返回正确的
Content-Type与字符集 - 静态资源有合理的长期缓存和版本指纹
- HTML 缓存不会把登录态或地区内容串给其他用户
- 使用内容协商时正确设置
Vary - CDN 缓存键只忽略经过确认的纯追踪参数
- 安全响应头不会阻止页面关键资源或嵌入场景
缓存问题经常表现为“本地正常、线上偶发”或“某个地区才出现”。检查时应记录 Cache-Control、Age、Vary、CDN 命中状态和代理链路。
七、页面元数据与分享
- 每页有独立、准确的 title 和 description
- 页面只有一个清晰的主标题
- Open Graph 和 Twitter Card 图片返回 200
- 分享图片尺寸、文字安全区和文件大小适合社交平台
- 结构化数据描述真实存在的内容或功能
- JSON-LD 中的 URL、日期、作者和图片与页面一致
不要声明网站并不存在的搜索、评分、商品或 FAQ 功能。结构化数据的目标是减少机器理解歧义,而不是制造额外关键词。
八、内容与内部链接
- 页面明确回答目标用户的问题
- 关键结论不是只存在于图片或客户端脚本中
- 内部链接使用最终规范 URL
- 锚文本能够解释目标内容
- 没有指向 404、重定向或过期活动页的链接
- sitemap 只包含允许索引且返回 200 的规范页面
工具页尤其需要解释输入、输出、限制和使用场景。只有输入框而缺少可抓取正文,很难覆盖更具体的搜索意图。
九、安全与隐私
- URL 输入会拒绝内网、localhost 和非 HTTP 协议
- 每次重定向后的新目标都会重新执行 SSRF 校验
- 不在日志中保存密码重置 token、OAuth code 等敏感参数
- 外部请求设置超时、响应体上限和最大跳数
- 分享报告不会泄露 Cookie、认证头或个人数据
- 用户生成页面具有正确的索引和过期策略
URL 检查工具本身也是服务端请求能力。仅校验初始地址不够,DNS 解析结果与后续重定向目标同样需要进入安全边界。
十、监控与发布门禁
建议在 CI、预发布和生产环境分别执行:
| 阶段 | 自动检查 |
|---|---|
| CI | 路由生成、内部链接、title、canonical、hreflang、结构化数据 |
| 预发布 | 状态码、重定向、资源 404、robots、sitemap |
| 生产发布后 | 多地区可用性、TLS、CDN 缓存、核心 URL 抽样 |
| 持续监控 | 5xx、404、重定向变化、证书到期、响应时间 |
对大型站点,不必每次扫描所有 URL。可以组合三类样本:高流量页面、每种模板的代表页面、最近发生变化的页面。域名迁移和路由重构则应增加全量旧 URL 映射检查。
问题如何分级?
| 级别 | 示例 | 发布决策 |
|---|---|---|
| P0 阻断 | 证书错误、全站 5xx、敏感数据泄露、重定向到恶意域名 | 立即停止或回滚 |
| P1 高优先级 | canonical 冲突、大量 404、循环跳转、私有内容被缓存 | 修复后才能发布 |
| P2 中优先级 | 多一跳、部分 description 缺失、低流量死链 | 明确负责人和期限 |
| P3 优化 | 分享图细节、非关键内容增强、轻微性能改进 | 进入后续迭代 |
分级的价值是统一发布决策,而不是弱化问题。每条豁免都应记录影响范围、负责人、截止日期和回滚条件。
一个最小自动化检查器
下面的 TypeScript 示例手动跟随重定向,并检测循环与最大跳数。生产版本还必须加入 DNS 与 SSRF 防护、超时、响应体上限和允许域名策略。
async function inspectUrl(input: string) {
const visited = new Set<string>();
const hops: Array<{ url: string; status: number }> = [];
let current = input;
for (let index = 0; index < 10; index += 1) {
if (visited.has(current)) {
throw new Error(`Redirect loop detected at ${current}`);
}
visited.add(current);
const response = await fetch(current, {
method: "GET",
redirect: "manual",
signal: AbortSignal.timeout(10_000),
});
hops.push({ url: current, status: response.status });
const location = response.headers.get("location");
if (!location || response.status < 300 || response.status >= 400) {
return { finalUrl: current, hops };
}
current = new URL(location, current).href;
}
throw new Error("Too many redirects");
}
这个示例故意不直接用于生产,因为 URL 检查器会代表服务器发起外部请求。实现时必须在初始 URL、DNS 解析结果和每个重定向目标上重复执行安全校验。
域名迁移的专项验证矩阵
普通页面发布抽样即可,域名迁移则应覆盖不同入口组合:
| 维度 | 样本 |
|---|---|
| 协议 | HTTP、HTTPS |
| 主机名 | www、非 www、历史子域名 |
| 路径 | 首页、栏目、详情、深层路径、404 |
| 参数 | 无参数、营销参数、功能参数、编码参数 |
| 身份 | 桌面、移动端、爬虫、API 客户端 |
| 地区 | 核心用户地区与不同 CDN 节点 |
每个组合都应验证首跳、最终 URL、状态码、内容主题和耗时。只抽查首页,无法证明数万条历史深层链接已经正确迁移。
明确团队所有权
URL 健康跨越多个团队,最容易出现“人人相关、无人负责”。建议明确:
- 开发负责路由、状态码、应用重定向和测试;
- 运维负责 DNS、TLS、CDN、代理和可用性监控;
- SEO 负责 canonical、hreflang、sitemap 和迁移映射;
- 安全负责 SSRF、敏感参数、外部请求和事件响应;
- 内容团队负责页面主题、内链和过期内容处置;
- 数据团队负责追踪参数、归因和日志生命周期。
所有权并不意味着单独决策。涉及域名、索引、缓存和隐私的变更,应在设计阶段共同评审,而不是上线前最后一天互相补洞。
发布验收标准
一个适合进入生产的公开 URL,至少应满足:
- 唯一规范版本返回 200;
- 其他入口一次 301 到规范版本;
- canonical、hreflang、sitemap 与内部链接相互一致;
- 桌面、移动端和爬虫获得预期内容;
- 页面元数据和分享图片有效;
- 无敏感参数泄露和明显 SSRF 风险;
- 发布后有持续监控与回滚方案。
常见问题
每次发布都需要检查全部 30 项吗?
不一定。首次上线、域名迁移和路由改版应完整执行;普通内容更新可以根据变更范围选择子集,但核心状态码、canonical、内部链接和构建检查仍应自动运行。
Lighthouse 可以替代 URL 检查吗?
不能。Lighthouse 更关注单个页面的性能、可访问性和最佳实践,无法完整覆盖多跳重定向、不同 User-Agent、批量状态码和 URL 规范化问题。
只检查首页够吗?
远远不够。首页通常配置最完善,真正的问题更容易出现在文章详情、筛选页、旧路径、多语言页和用户生成页面。