一、问题现象
表现:RSSHub 访问 /v2ex/topics/latest、/v2ex/tab/qna 等路由返回 503 Service Unavailable,容器日志记录上游报错 FetchError: [GET] "https://www.v2ex.com/api/...": 403 Forbidden。
反常点:
- 宿主机/容器内执行
curl -I https://www.v2ex.com/api/...返回200 OK。 - 容器内使用原生
node -e 'fetch(...)'发起 GET 请求也返回200 OK。
二、排查与根因分析
| 测试方式 | 结果 | 说明 |
|---|---|---|
curl -I(HEAD 请求) |
200 OK |
命中了 Cloudflare 边缘缓存(cf-cache-status: HIT),未触发动态 WAF 检测。 |
原生 node fetch / ofetch |
200 OK |
证明服务器 IP 未被拉黑,底层网络、DNS 及 Node.js 的 TLS 指纹正常。 |
| RSSHub 内部请求 | 403 Forbidden |
根因所在。 |
核心原因:
V2EX 近期收紧了 Cloudflare WAF 风控策略。RSSHub 内部封装请求时,默认会注入带有项目标识的 User-Agent(如 ... RSSHub/1.0)及特定的请求头。Cloudflare 识别到来自数据中心机房 IP(IDC)且携带爬虫标识头时,直接拦截并返回 403。
三、解决办法
在 docker-compose.yml 中为 rsshub 服务注入合法的浏览器全局 UA,覆盖默认的爬虫标识:
services:
rsshub:
environment:
# 伪装为原生桌面 Chrome,抹除 RSSHub 请求特征
UA: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'
更新配置并重启生效:
docker compose up -d rsshub