私有RSS Feed是指需要经过身份验证才能访问的RSS订阅源,它与普通公开Feed最大的区别在于服务器不会向匿名请求返回文章列表。对付费内容来说,如果直接给出普通RSS地址,任何拿到链接的人都能永久免费订阅,因此必须引入密码或令牌保护。受密码保护的RSS源通常借助HTTP基础认证、查询参数令牌或应用层校验来限制读取权限。

一、私有RSS Feed的核心原理
普通RSS本质上是一个静态或动态生成的XML文件,客户端如NewsBlur、Feedly会定期请求该地址并解析其中的<item>节点。私有Feed则在服务端增加了一道闸门:当请求到达时,先检查请求头或参数中的凭证,验证通过才输出XML,否则返回401或未授权页面。这样一来,即使源地址被传播,没有账号密码也无法获取内容。
从实现层级看,私有RSS可分为传输层保护和应用层保护。传输层常用HTTP Basic Auth,由Web服务器(如Nginx)直接拦截;应用层则由后端程序在生成XML前查询数据库,判断用户订阅状态。对于付费场景,应用层更灵活,因为它能绑定具体订单到期时间,而基础认证通常只存固定账号密码。
1.1 为什么不能用“隐藏链接”代替密码
有些作者把Feed地址设成随机长字符串,以为别人猜不到就安全。实际上只要有一位付费用户泄露,爬虫就能无限抓取,且你无法区分是哪个用户泄漏。密码保护配合独立令牌,则可以在后台看到每次拉取对应的用户,发现异常立即吊销。
另外,私有Feed的凭证可以定期轮换。例如每30天给付费用户发新地址,旧地址失效,这比永久隐藏链接可控得多。下面我们用Nginx基础认证加动态脚本的方式搭建一个简单可用的方案。
二、用HTTP基础认证快速搭建密码保护源
如果付费内容规模小,不想写复杂后端,可用Nginx的auth_basic模块。先生成密码文件,再把Feed路由保护起来。注意RSS阅读器大多支持在订阅地址里写用户名密码,形如 https://user:pass@ipipp.com/feed.xml。
以下步骤假设你的Feed由 /var/www/feed.php 动态生成,Nginx配置如下。我们用htpasswd创建账号,每个付费用户给一个独立账号,方便撤销。
server {
listen 80;
server_name ipipp.com;
location /feed.xml {
auth_basic "Private Feed";
auth_basic_user_file /etc/nginx/feed_passwd;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/feed.php;
}
}
生成密码文件可用命令:htpasswd -c /etc/nginx/feed_passwd user01,按提示输入密码。这样用户必须在阅读器填账号密码。缺点是Nginx层无法知道用户订单是否过期,只能手动删账号。
2.1 基础认证的优缺点
优点是非常简单,五分钟就能上线,且几乎所有RSS客户端都兼容基础认证。缺点是凭证以Base64明文随请求头发送,必须配合HTTPS;且账号管理分散,不适合成千上万付费用户。
若你的站点已经有用户系统,更推荐在应用层校验,而不是依赖Nginx账号。接下来我们看如何用PHP在输出RSS前检查付费令牌。
三、应用层令牌校验方案(适合付费系统)
假设你的网站用户表有字段 token 和 expire_at。付费用户订阅时分配一个随机token,Feed地址变成 https://ipipp.com/feed.php?u=用户名&t=令牌。服务端先查令牌有效性,再输出内容。
这种方式下,后台能记录最后访问时间,订单过期就把expire_at设为过去,脚本直接返回401。下面是一段简化的PHP示例,注意里面XML里的尖括号已转义为实体,避免破坏结构。
<?php
$user = $_GET['u'] ?? '';
$token = $_GET['t'] ?? '';
// 模拟数据库查询
$pdo = new PDO('mysql:host=127.0.0.1;dbname=site', 'root', '');
$stmt = $pdo->prepare('SELECT expire_at FROM users WHERE name=? AND token=?');
$stmt->execute([$user, $token]);
$row = $stmt->fetch();
if (!$row || strtotime($row['expire_at']) < time()) {
header('HTTP/1.1 401 Unauthorized');
echo 'Access denied';
exit;
}
header('Content-Type: application/rss+xml; charset=utf-8');
echo '<?xml version="1.0"?>';
?>
<rss version="2.0">
<channel>
<title>付费专栏</title>
<item>
<title>第1课:私有Feed入门</title>
<description>本课介绍如何保护RSS源</description>
</item>
</channel>
</rss>
上面的代码先验证再输出,确保未付费请求拿不到任何文章。你可以把token生成逻辑做成:用户付费成功时调用 bin2hex(random_bytes(16)) 写入库表,保证不可猜测。
为了进一步提升安全性,可把令牌放在Authorization头而非URL,因为URL会被阅读器历史记录。但多数免费RSS客户端不支持自定义头,所以URL令牌仍是兼容性最好的折中。
四、运维与撤销策略
私有Feed上线后,重点在权限生命周期管理。建议给每个用户独立令牌,而非全站共用一个密码;这样某用户退款或泄露,只需废掉他的令牌,不影响其他人。
另外可在应用层统计拉取频率,若发现同一令牌每分钟请求百次,可能是被转发到公共爬虫,应及时封禁。下表对比两种保护方式:
| 方式 | 适用规模 | 能否按订单过期 | 客户端兼容 |
|---|---|---|---|
| HTTP基础认证 | 几十人 | 需手动 | 极好 |
| 应用层令牌 | 任意 | 自动 | 好 |
综合来看,为付费内容创建受密码保护的RSS源,核心就是“验证后再吐数据”。从小用Nginx基础认证起步,用户多了切到应用层令牌,既能控制成本,也能保障内容不裸奔。
private_RSS_feedHTTP_basic_authpaid_content修改时间:2026-07-31 22:27:32