
FreshRSS 0.1—0.7 早期版本演进史从首个原型到多用户新闻聚合器的技术复盘【免费下载链接】FreshRSSA free, self-hostable news aggregator…项目地址: https://gitcode.com/gh_mirrors/fr/FreshRSS导读本文以仓库内 docs/CHANGELOG-old.md记录 2013 年 0.1.0 至 2014 年 0.7.1 的法国原版更新日志为线索系统复盘 FreshRSS 早期版本的架构演进从单用户原型到多用户体系、SQL 重构与检索语法、HTML5 内容净化、cookie 与缓存策略以及至今仍可追溯的代码遗迹。读完本文你将理解这些历史版本如何塑造了今天仓库中的目录结构与核心模块并掌握intitle:/inurl:/author:等检索关键字、no-cache.txt调试开关等早期设计在当代源码中的真实落点。一、版本脉络FreshRSS 早期发布的四个关键阶段根据 docs/CHANGELOG-old.mdFreshRSS 从 2013 年 4 月 8 日的 0.1.0标注为Première version即首个版本到 2014 年 2 月 19 日的 0.7.1共经历约 8 个里程碑发布可归纳为四个阶段阶段版本时间核心主题原型期0.1.0 ~ 0.2.02013-04 ~ 2013-05首个可运行版本、安装程序、Ajax 刷新功能成型期0.3.0 ~ 0.4.02013-05 ~ 2013-07i18n、多主题、lazyload、日志页、阅读/全局视图稳定化期0.5.0 ~ 0.6.12013-10 ~ 2013-11匿名访问控制、token 访问、keep_history、性能修复架构重构期0.7 ~ 0.7.12014-01 ~ 2014-02多用户模式、SQL 重构、新搜索、HTML5 净化、目录重组其中 0.7 与 0.7.1 两个版本贡献了日志约 40% 的条目是早期发展中最重要的一次架构升级也是下文分析的重点。二、v0.7 多用户架构FreshRSS 从个人工具走向自托管平台2.1 三种认证方式的引入v0.7 的核心变化是引入多用户模式默认用户管理员可以创建和删除其他用户。同时登录方式从单一方案扩展为三种表单登录Form Auth用户名 密码密码不以明文传输相对安全即使没有 HTTPS要求 JavaScript 与 PHP 5.3。HTTP 认证例如在 Apache 下创建./p/i/.htaccess与.htpasswd此时 HTTP 用户名必须与 FreshRSS 用户名一致。Mozilla Persona通过填写用户的电子邮件地址完成联邦登录该服务已随 Persona 关停而退出历史舞台。该设计在当代源码中仍有明确继承。仓库中 app/Models/Auth.php 依然是认证的核心门面而 app/Models/FormAuth.php 正是当年表单登录路线的直接后代控制器 app/Controllers/authController.php 负责登录、注册、登出等动作的编排。2.2 会话 Cookie 策略目录隔离 HttpOnly多用户与匿名可读并存后v0.7 重写了会话 cookie 策略cookie 名称采用中性的FreshRSS避免被部分过滤器误伤cookie 作用域被限制在./FreshRSS/p/i/目录下从而让图片、CSS、脚本等静态资源无 cookie 传输提升 HTTP 性能启用HttpOnly标志增强安全性。当代实现中lib/Minz/Session.php 第 51 行显式设置了$params[httponly] true;并支持通过session_name()配置会话名称正是这条策略的延续。同时lib/http-conditional.php 在条件请求指纹中混入session_name() . . session_id()说明会话上下文仍深度参与 HTTP 缓存判定——这是按用户区分缓存的关键实现细节。2.3 目录重组一切用户数据归入 ./data/0.7 对文件布局做了大规模整理核心原则是所有用户文件统一放入./data/。日志中列出的关键迁移包括./app/configuration/application.ini→./data/config.php./public/data/Configuration.array.php→./data/*_user.php./public/→./p/其中./public/index.php→./p/i/index.php与 cookie 目录策略配套./actualize_script.php→./app/actualize_script.php并要求用户同步更新 Cron 配置从当前仓库看这套布局至今基本未变p/目录存放 Web 入口p/i/index.php、p/api/等app/actualize_script.php仍是 CLI 实际化脚本而data/依然承载users/、favicons/、PubSubHubbub/等运行时数据。0.6 升级到 0.7 时只需把旧的application.ini与Configuration.array.php放入新目录./data/之后各版本升级只需保留./data/目录安装程序即可完成迁移。三、SQL 重构与搜索系统v0.7 的内功升级3.1 表前缀与多用户隔离v0.7 对数据库做了不兼容重构所有表以用户名作为前缀以支持多用户模式同时压缩在 MySQL 侧完成而非 PHP 侧显著提升性能并容忍更大的文章数量。日志明确提示该版本与 0.6 不兼容需通过安装程序完成升级。从源码看这条路线延续至今数据库 DAO 均按用户上下文操作例如 app/Models/FeedDAO.php 的 SQL 均拼接用户级前缀表名app/Models/CategoryDAO.php 第 38 行的注释直接描述_feed表结构为priority:int, pathEntries:string, httpAuth:string, error:int, keep_history:?int, ttl:int, attributes:string其中keep_history正是 v0.5.0 新增的字段见下文。3.2 搜索关键字intitle / inurl / authorv0.7 引入新搜索引擎并支持intitle:、inurl:、author:三类关键字且可从移动视图访问。这一语法在现代 FreshRSS 中不仅完整保留还被大幅扩展app/Models/Search.php 定义了intitle、intitle_regex、inurl、inurl_regex、author、author_regex、tags、tags_regex等字段并支持-intitle:、-inurl:等否定形式见第 426 行附近的序列化逻辑app/Controllers/searchController.php 第 85、95 行分别用intitle:与inurl:构造OR子句证明这两个关键字在 URL 参数解析层仍然生效布尔搜索的完整语法解析位于 app/Models/BooleanSearch.php承担AND/OR/NOT与括号组合的解析工作。值得注意的另一点v0.7 起文章排序以加入 FreshRSS 的时间而非声明日期常不准确为准这使全部标记为已读不会误伤阅读期间新到达的文章也使得分页变得高效。这一以入库时间为准的排序策略是新闻聚合器正确性的关键设计。3.3 其他 SQL 改进显示数据库体积在 FreshRSS 界面内修复将所有收藏标记为已读的缺陷表结构按用户前缀重构后改善了性能并支持远多于 0.6 的文章数量。四、HTML5 内容净化与媒体处理RSS 全文抓取面临的最大风险是外部内容注入v0.7 在 HTML5 层面做了系统性的安全加固原生 HTML5 媒体支持audio、video及关联元素默认preloadnone并正确重写资源地址含 HTTPS 场景iframe 防护sandboxallow-scripts allow-same-originobject/embed 过滤直接剔除这两类风险标签延迟加载iframe 与 video 使用postpone延迟加载iframe 内的 JavaScript 同样被推迟。这套净化思路至今仍体现在内容渲染管线中文章内容在入库与展示前会经过过滤与属性重写处理且 HTTPS 重写与延迟加载策略与日志描述一致。对自托管阅读器而言抓取不可信源 安全渲染是核心工程命题v0.7 的做法奠定了后续版本的基调。五、缓存、条件请求与刷新性能v0.7.10.7.1 的更新重点在于刷新性能与缓存利用更快的刷新充分利用缓存对不支持条件请求的源采用感兴趣内容 MD5 签名判定是否变化刷新队列 JSON 化待刷新 feed 队列的管理更稳健只刷新近期未刷新的 feed并允许匿名用户触发刷新SimplePie 升级修复内存泄漏增强对无效 feed 的容错。值得注意的是条件请求HTTP Conditional与缓存键的设计一直延续到今天lib/http-conditional.php 把会话 ID 纳入缓存指纹使匿名与登录用户可安全共享 HTTP 缓存。这解释了为何 0.7 会把 cookie 作用域压缩到p/i/——静态资源不带 cookie才能最大化缓存命中率。另外v0.7 引入了开发调试开关创建./data/no-cache.txt即可禁用 HTTP 缓存。该开关至今有效app/Controllers/extensionController.php 第 364 行仍检测DATA_PATH . /no-cache.txt是否存在以决定是否跳过条件请求缓存此处配合httpConditional()使用缓存时长 604800 秒。六、交互与 UI快捷键、阅读状态与移动端6.1 快捷键体系0.7.1s在只有一种分享方式时直接分享多种分享方式依次由1、2、3… 激活Home跳到第一篇End跳到最后一篇新增在分类/feed 间移动的快捷键配合Shift与Alt修饰键快捷键说明按组展示。当前仓库中快捷键体系已高度可配置化用户可在配置页自行绑定视图模板 app/views/configure/shortcut.phtml 承载了快捷键配置界面底层由FreshRSS_UserConfiguration持久化。6.2 阅读状态与自动标记新增收到即标记已读选项全部标记为已读后可跳过到下一个含未读的分类/feed0.5.0 起滚轮滚动时自动标记已读0.4.0 引入取代页面加载时标记的旧选项修复阅读导航在末尾处循环的问题修复点击外部链接图标时误展开文章的问题新增收藏筛选与已读筛选视图0.7允许删除某个 feed 的全部文章0.7。这些交互能力在当代代码中仍可对应阅读模式normal/global/reader由 app/Models/ViewMode.php 与 app/Models/ReadingMode.php 管理视图模板位于 app/views/index/normal.phtml、global.phtml、reader.phtml。6.3 移动端与可访问性0.7 强调更完善的无障碍无图片Unicode 替代与无 CSS 环境下也能使用0.4 起移动端拥有更大的按钮与导航栏。0.7 同时改进了窄屏长标题的展示并支持深色主题0.7 起新增默认深色主题主题加载机制更稳健。七、分享、导入导出与 OPML分享目标扩展0.2 支持邮件与 Shaarli0.5 增加 Facebook、Twitter、Google0.7 扩展 Shaarli、Poche、Diaspora*、Facebook、Twitter、Google、邮件并默认绑定s快捷键。OPML0.7 实现即时且更宽容的 OPML 导入可导入无分类的 feed0.4 起导入无效 OPML 会显示错误提示。导入后自动触发 feed 刷新0.6。导出0.2 起支持按 feed 导出 RSS0.5 起支持为匿名访问生成 token用于访问 FreshRSS 生成的 RSS 输出。在当代仓库中OPML 导入导出已演进为完整的导入导出服务app/Services/ImportService.php 与 app/Services/ExportService.php对应控制器 app/Controllers/importExportController.php并支持 zip / OPML / SQLite 等多种载体。八、keep_history文章保留策略的源头0.5.0 在feed表新增keep_history字段用于控制每个 feed 的历史保留策略0.7 进一步允许更精细地配置每个 feed 最少保留的文章数。从当前源码看该字段至今仍在活跃使用app/SQL/install.sql.mysql.php 第 39 行附近可看到INDEX (priority) -- v0.7等带版本注释的建表痕迹app/Models/CategoryDAO.php 第 47、50 行在整理/清理分类时读取$feed[keep_history]并在第 77 行执行ALTER TABLE _feed DROP COLUMN keep_history的迁移逻辑app/Models/Context.php 第 140 行使用keep_history_default计算每 feed 的最小保留数$keepMinapp/Models/UserConfiguration.php 声明了keep_history_default属性旧版 1.15 的兼容处理见 app/Controllers/configureController.php 第 376 行。也就是说每 feed 保留策略自 0.5.0 提出、0.7 精细化以来一直是 FreshRSS 架构的稳定组成部分。九、早期版本留下的工程遗产清单将日志与当前仓库对照可梳理出如下至今可验证的遗产0.1–0.7 引入的特性当代源码落点表单认证路线app/Models/FormAuth.php、app/Controllers/authController.phpintitle:/inurl:/author:搜索app/Models/Search.php、app/Controllers/searchController.phpkeep_history 保留策略app/Models/CategoryDAO.php、app/Models/Context.php./data/no-cache.txt调试开关app/Controllers/extensionController.phpHttpOnly 目录限定 cookielib/Minz/Session.php会话参与条件请求指纹lib/http-conditional.php./p/、./app/actualize_script.php、./data/布局仓库根目录即当前布局快捷键与阅读/全局视图app/views/configure/shortcut.phtml、app/views/index/导入导出服务app/Services/ImportService.php、app/Services/ExportService.php十、给运维者与开发者的三条实用结论升级历史路径清晰0.6 及以前版本升级到 0.7 需要迁移配置文件application.ini与Configuration.array.php→./data/0.7 之后只需保留./data/目录交给安装程序处理。若你维护的是当年遗留实例这条迁移逻辑是理解数据目录结构的关键。缓存与 Cookie 是配套设计cookie 限定在p/i/ 静态资源无 cookie 条件请求指纹混入会话三者共同支撑了匿名/登录共存下的缓存效率。现代部署若要调优缓存应同时审视这三处。调试手段可复用开发或排障时创建data/no-cache.txt可绕过 HTTP 条件缓存而intitle:、inurl:、author:关键字在 app/Models/Search.php 中已扩展出正则与否定形式可作为高级检索入口。延伸阅读更新版本0.8 及以后的英文更新日志见 docs/CHANGELOG-old2.md当前主分支的完整变更记录见 CHANGELOG.md。本文所有源码引用均来自当前仓库行号与文件路径可直接在仓库中定位验证。【免费下载链接】FreshRSSA free, self-hostable news aggregator…项目地址: https://gitcode.com/gh_mirrors/fr/FreshRSS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考