Tag: rss

4 notes found.

自建 Miniflux 订阅 jdon.com,开「抓取原始内容」后全文永远是「点击验证你是真人」,点开原文也弹验证。根因是缺少 Referer 触发人机验证,恰好命中 Miniflux 的隐私设计。解法是加一层反代补上 Referer。

jdon.com 套着腾讯云 EdgeOne,判据就是 Referer:不带 Referer 的请求一律回验证页(HTTP 200,body 是验证页,跳 /captcha/refer.shtml,路径里的 refer 就是提示)。用 curl 做单变量矩阵可确认——UA 换成什么都是验证页,只要带任意 Referer 就正常。

而 Miniflux 发不出 Referer:

  • 出于隐私设计,外链强制 referrerpolicy="no-referrer",抓原文也不发
  • 不支持按 feed 注入请求头(只有 UA / Cookie / 代理)
  • HTTPS forward proxy 是隧道,加不了 TLS 内的请求头

所以 Miniflux 侧没有可改的地方,只能在链路上加一层反代:

server {
    listen 8080;
    resolver 127.0.0.11 valid=600s ipv6=off;  # Docker 内嵌 DNS
    set $upstream https://www.jdon.com;

    # 只对 /rss 改写链接,让「抓原文」和「点开原文」都汇聚到本代理
    location = /rss {
        proxy_pass $upstream;
        proxy_set_header Host www.jdon.com;
        proxy_ssl_server_name on;
        proxy_set_header Referer https://www.jdon.com/;   # 核心
        proxy_set_header Accept-Encoding "";              # gzip 内容 sub_filter 改不了
        sub_filter 'https://www.jdon.com' 'https://rss-proxy.example.com';
        sub_filter_types application/rss+xml application/xml text/xml;
        sub_filter_once off;
    }

    # 其余路径纯透传(只补 Referer),HTML 不改写
    location / {
        proxy_pass $upstream;
        proxy_set_header Host www.jdon.com;
        proxy_ssl_server_name on;
        proxy_set_header Referer https://www.jdon.com/;
    }
}

Miniflux 把 feed URL 改指代理即可。

可以使用 标签在 HTML 的 中声明 RSS, 这样大多数现代浏览器会自动发现。

示例:

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>你的网站标题</title>

    <!-- RSS Feed 声明 -->
    <link
      rel="alternate"
      type="application/rss+xml"
      title="技术博客 RSS"
      href="/rss.xml"
    />

    <!-- 如果是 Atom Feed -->
    <link
      rel="alternate"
      type="application/atom+xml"
      title="技术博客 Atom"
      href="/atom.xml"
    />
  </head>
  <body>
    <!-- 网页内容 -->
  </body>
</html>