You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js中检测网站的自定义404页面

检测网站自定义404页面(Node.js实现)

自定义404页面的核心特点是HTTP状态码可能返回200(而非标准404),但页面内容是网站专门设计的“页面不存在”提示,因此不能仅靠状态码判断,需要结合内容特征检测。以下是具体实现方案:

核心检测维度

  • 关键词匹配:页面中是否包含“页面不存在”“Page Not Found”“404”等明确的404提示文本
  • Meta标签检查:多数自定义404会添加<meta name="robots" content="noindex">,避免搜索引擎收录无效页面
  • 页面结构差异:对比可疑页面与网站正常页面的结构(如是否缺失导航栏、存在特定404专属元素ID/class)
  • 内容相似度:可疑页面与正常页面的文本/HTML长度差异过大(通常超过30%)

Node.js 实现代码

依赖安装

npm install node-fetch jsdom

检测函数

const fetch = require('node-fetch');
const { JSDOM } = require('jsdom');

/**
 * 检测目标页面是否为自定义404页面
 * @param {string} targetUrl - 待检测的可疑页面URL
 * @param {string} [normalPageUrl] - 网站正常页面的URL(用于对比内容差异)
 * @returns {Promise<boolean>} 是否为自定义404
 */
async function detectCustom404(targetUrl, normalPageUrl) {
  // 获取目标页面内容
  const res = await fetch(targetUrl);
  const html = await res.text();
  const dom = new JSDOM(html);
  const doc = dom.window.document;

  // 1. 检查404关键词
  const has404Keywords = /(页面不存在|Page Not Found|404 Not Found|找不到页面)/i.test(html);

  // 2. 检查robots meta标签是否为noindex
  const robotsMeta = doc.querySelector('meta[name="robots"]')?.getAttribute('content');
  const isNoIndex = robotsMeta?.toLowerCase().includes('noindex');

  // 3. 对比与正常页面的内容长度差异(可选)
  let hasContentDiff = false;
  if (normalPageUrl) {
    const normalRes = await fetch(normalPageUrl);
    const normalHtml = await normalRes.text();
    const lengthRatio = Math.abs(html.length - normalHtml.length) / normalHtml.length;
    hasContentDiff = lengthRatio > 0.3; // 差异超过30%判定为异常
  }

  // 4. 检查是否存在404专属元素
  const has404Element = !!doc.getElementById('404-page') || !!doc.querySelector('.page-404');

  // 综合判定:满足任一核心条件则认为是自定义404
  return has404Keywords || (isNoIndex && hasContentDiff) || has404Element;
}

// 使用示例
detectCustom404('https://your-site.com/nonexistent-path', 'https://your-site.com')
  .then(isCustom404 => console.log('是否为自定义404:', isCustom404))
  .catch(err => console.error('检测失败:', err));

优化建议

  • 根据目标网站调整关键词和元素选择器(比如GitHub的自定义404可匹配.container-404元素)
  • 若无法获取正常页面URL,可跳过内容差异检查,仅依赖关键词和Meta标签
  • 对于部分返回非200状态码的自定义404(如403、404),可先判断状态码,再结合内容验证

内容的提问来源于stack exchange,提问作者AbhiDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:05:22