本文约 3,171 字,预计阅读 8 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:藏起来的内容,搜不到,还可能被罚
站长藏内容通常有两个动机。一是排版需要:FAQ 太长,做个折叠面板;多语言切换,把另一种语言藏起来;嵌入第三方内容,用 iframe 隔离样式。二是动歪脑筋:在页脚塞一段白底白字的关键词,或者用 font-size:0 藏一堆长尾词,指望百度能抓到又不影响观感。第一类动机完全合理,只是实现方式容易踩线;第二类属于明确的作弊行为,命中百度清风算法与网页质量规范的判定后,轻则该页降权,重则整站被限制收录。两者的分界线其实很清楚:隐藏的目的是否为了让用户看不到、而让搜索引擎看得到。
原理分析:百度如何识别隐藏内容
百度的判断逻辑大致分三层。第一层是 HTML/CSS 层面:元素是否 display:none、visibility:hidden、尺寸为 0、颜色与背景一致、被定位到屏幕外(如 position:absolute;left:-9999px)。第二层是渲染对比:把渲染后可见的文本与源码文本做比对,差值过大即为可疑。第三层是语义判定:隐藏部分的文本是否与页面主题无关、是否呈现关键词堆砌特征(大量无语义的短语拼接)。三层中任何一层命中都会进入人工或算法的复核队列。
iframe 的问题不同,它不涉及隐藏,而是归属与空壳问题。iframe 里的内容在源码中不可见,百度不会把它算作当前页面的正文(除非抓取 iframe 的 src 并做归属处理,但这在实践里不稳定)。如果页面主体内容全靠 iframe 承载,百度看到的就是一个空壳页。
| 用法 | 风险等级 | 建议 |
|---|---|---|
| 白底白字/同色文字 | 极高 | 禁用 |
font-size:0 / left:-9999px |
高 | 禁用 |
| 正文关键词堆砌后隐藏 | 极高 | 禁用 |
| 折叠面板(内容在源码中) | 低 | 可用 |
| Tab 切换(内容在源码中) | 低 | 可用 |
| 移动端隐藏次要模块 | 低 | 可用,注意主内容一致 |
| iframe 嵌入广告/视频 | 中 | 可用,但不计入正文 |
| iframe 承载主体正文 | 高 | 改造为直出 |
保姆级实操
步骤 1:全站扫描可疑的隐藏写法。 先查数据库里是否残留这类 CSS 痕迹:
SELECT ID, post_title
FROM wp_posts
WHERE post_status = 'publish'
AND (
post_content LIKE '%display:none%'
OR post_content LIKE '%font-size:0%'
OR post_content LIKE '%left:-9999%'
OR post_content LIKE '%visibility:hidden%'
)
LIMIT 100;
步骤 2:自查颜色伪装。 用浏览器开发者工具检查是否有文字颜色与背景色相同(color 与 background-color 值一致)。这类在源码里看不出来,只能渲染后对比。
步骤 3:把折叠面板改成原生语义标签。 <details> / <summary> 是浏览器原生折叠控件,内容完整存在于 HTML 源码中,属于完全合规的折叠方案:
<details class="faq-item" open>
<summary>百度的抓取诊断在哪里?</summary>
<div class="faq-body">
<p>登录百度搜索资源平台,进入对应站点后,在左侧「抓取诊断」中可以输入 URL 查看百度蜘蛛获取到的页面源码与状态。</p>
<p>建议每次改版后抽查 10 个代表页,确认正文在源码中完整可见。</p>
</div>
</details>
步骤 4:如果必须用 JS 折叠,保证初始 HTML 里内容完整。 下面这种 CSS 写法是安全的:内容始终存在于 DOM 与源码中,只是通过高度限制折叠。避免使用 display:none:
.faq-body {
max-height: 0;
overflow: hidden;
transition: max-height .25s ease;
}
.faq-item.is-open .faq-body {
max-height: 60rem;
}
/* 打印与无 JS 场景强制展开,保证内容始终可达 */
@media print {
.faq-body { max-height: none; }
}
.no-js .faq-body { max-height: none; }
步骤 5:检查 iframe 使用。 用 grep 找出所有 iframe,逐个判断是否承载了主体内容:
grep -o '<iframe[^>]*src="[^"]*"' /var/www/html/wp-content/themes/your-theme/*.php
grep -c '<iframe' /var/www/html/wp-content/themes/your-theme/single.php
若正文由 iframe 承载,改造方案是把内容从 iframe 里搬出来,改用短代码或区块直接在模板中输出。视频、广告、第三方工具类的 iframe 可以保留,但要给 iframe 加上 title 属性,并在周边补充文字说明,避免页面被判定为内容空洞。
步骤 6:移动端与 PC 端内容保持一致。 响应式站点用 CSS 隐藏次要模块是允许的,但主标题、正文、关键参数不能只出现在其中一端。百度移动索引与 PC 索引分开处理,两端内容差异过大就会被判定为变体页面。
常见踩坑
- 为了「提升关键词密度」,在页脚塞同色关键词,被判定堆砌后整站质量分下滑。
- 案例: 某站用 iframe 引入一个「相关文章」板块,本意是隔离样式,结果 iframe 里的链接与正文一起被算进页面,页面被判定为内容拼凑;更糟的是 iframe 的 src 域名后来失效,页面出现大面积空白区块,跳出率飙升,两个月后该批页面被批量删除索引。
- Tab 切换用
display:none隐藏其他面板,虽然内容在源码里,但若整个模块初始状态全隐藏,仍可能被判为隐藏内容——建议默认展开第一个面板。 - 用
text-indent:-9999px做 logo 的文字替换,logo 区溢出到页面外,被判为屏幕外隐藏。 - 移动端把正文段落隐藏了一部分(「查看更多」),移动端页面被判内容不完整。
- 多语言插件把其他语言内容用 CSS 隐藏输出在同一 URL,导致页面出现大量重复段落。
- 用
visibility:hidden做延迟加载占位,但忘了加载完成后恢复可见,内容长期不可见。
总结
判断隐藏是否合规,用一个问题检验:把 JS 与 CSS 全部关掉后,用户还能不能读到这段内容? 能读到就安全,读不到就有风险。行动清单:SQL 扫描四种高危 CSS → 检查颜色伪装 → 折叠改用 <details> 或 max-height 方案 → iframe 只承载视频/广告/工具,不承载正文 → 保证移动端与 PC 端主内容一致。合规的折叠既满足排版需求,也完全不影响收录。内容直出的原则同样适用于 百度对 AJAX 加载内容的处理,页面广告与内容占比的边界见 页面广告比例与百度体验评价。
