查看“︁Miniflux脚本异常”︁的源代码
←
Miniflux脚本异常
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
最近在自建 Miniflux 时遇到一个比较隐蔽的问题:API Key 本身已经可以正常使用,但在 Miniflux 后台页面中点击 <abbr>API</abbr> Key 后面的“移除”按钮时,始终无法删除。 这个问题一开始看起来像是 Miniflux 的 API、反向代理、Cookie、BASE_<abbr>URL</abbr> 或权限问题,但最后发现真正原因是: * Cloudflare 开启了 Rocket Loader; * Rocket Loader 向 Miniflux 页面注入了脚本; * Miniflux 的 Content Security Policy 阻止了该脚本; * 页面 JavaScript 行为异常,导致删除按钮无法正常发起请求。 == 问题现象 == 环境大致如下: * Miniflux 使用 Docker 部署;使用端口8043 * 通过反向代理暴露到域名; * 域名经过 Cloudflare; * Miniflux 后台地址类似:<code><nowiki>https://miniflux.example.com/</nowiki></code> 一开始测试 <abbr>API</abbr> Key 时返回: {"error_message":"access unauthorized"} 后来确认 <abbr>API</abbr> Key 问题已经解决,使用如下方式可以正常访问 API: curl -i \ -H "X-Auth-Token: 你的API_KEY" \ <nowiki>http://127.0.0.1:8043/v1/me</nowiki> 但是在 Miniflux 后台的 <abbr>API</abbr> Keys 页面,点击“移除”按钮仍然没有反应。 == 初步排查 == 首先检查 Miniflux 服务是否正常: curl -i <nowiki>http://127.0.0.1:8043/healthcheck</nowiki> 返回: HTTP/1.1 200 OK OK 说明服务本身正常。 继续测试 <abbr>API</abbr> 路径: curl -i <nowiki>http://127.0.0.1:8043/v1/me</nowiki> 返回: HTTP/1.1 401 Unauthorized {"error_message":"access unauthorized"} 这里的 401 是正常的,因为没有携带认证信息。它反而说明: * <code>/v1/me</code> 路径存在; * <abbr>API</abbr> 路径没有 404; * Miniflux <abbr>API</abbr> 服务是可访问的。 再测试错误的子路径: curl -i <nowiki>http://127.0.0.1:8043/rss/v1/me</nowiki> 返回类似: HTTP/1.1 302 Found Location: /?redirect_url=%2Frss%2Fv1%2Fme 这说明 <code>/rss/v1/me</code> 被当作普通网页路径处理,并不是正确的 <abbr>API</abbr> 路径。 因此可以判断:本例中 <abbr>API</abbr> 正确路径应为: /v1/me 而不是: /rss/v1/me == 验证后台删除能力 == 为了确认后端是否真的可以删除 <abbr>API</abbr> Key,可以绕过网页,直接使用 <abbr>API</abbr> 删除。 先列出 <abbr>API</abbr> Keys: curl -i -u '你的用户名:你的密码' \ <nowiki>http://127.0.0.1:8043/v1/api-keys</nowiki> 找到要删除的 Key ID 后执行: curl -i -X DELETE -u '你的用户名:你的密码' \ <nowiki>http://127.0.0.1:8043/v1/api-keys/要删除的ID</nowiki> 如果返回: HTTP/1.1 204 No Content 说明 Miniflux 后端删除功能是正常的。 这时问题就不在数据库,也不在 <abbr>API</abbr> Key 本身,而更可能在网页前端、浏览器、反向代理或 CDN 层。 == 关键线索:点击按钮后没有任何请求 == 接着打开浏览器开发者工具: # 切换到 <code>Network</code> 面板; # 点击 <abbr>API</abbr> Key 后面的“移除”按钮; # 观察是否有新的请求发出。 结果发现: * 点击按钮后没有任何新的网络请求; * 页面 <abbr>URL</abbr> 只是从: <nowiki>https://miniflux.example.com/keys</nowiki> 变成了: <nowiki>https://miniflux.example.com/keys#</nowiki> 这个现象非常关键。 <code>#</code> 只是页面锚点变化,说明点击的是类似这样的前端链接: <'''a''' href="#">移除</'''a'''> 正常情况下,页面 JavaScript 应该拦截这个点击事件,然后发起删除请求。 但现在只出现了 <code>#</code>,没有发请求,说明 JavaScript 没有正常执行。 == 控制台报错 == 继续查看浏览器开发者工具里的 <code>Console</code> 面板,发现如下报错: Refused to load <nowiki>https://miniflux.example.com/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js</nowiki> because it does not appear in the script-src directive of the Content Security Policy. 这个错误说明: * Cloudflare 正在向页面注入 Rocket Loader 脚本; * Miniflux 页面设置了 Content Security Policy; * CSP 不允许加载 Cloudflare 注入的 <code>rocket-loader.min.js</code>; * 浏览器拒绝加载该脚本; * 页面脚本执行受到影响。 最终确认,这就是后台按钮失效的原因。 == 解决方法 == 进入 Cloudflare 后台,关闭 Rocket Loader。 大致路径为: Cloudflare Dashboard -> 选择对应域名 -> Speed -> Optimization -> Rocket Loader -> Off 如果不想影响整个域名,可以只针对 Miniflux 子域名关闭 Rocket Loader,例如: Hostname equals miniflux.example.com Rocket Loader = Off 关闭后建议再执行以下操作: # 清理 Cloudflare 缓存; # 浏览器按 <code>Ctrl + F5</code> 强制刷新; # 或者使用无痕窗口重新登录; # 再次进入 Miniflux 后台 <abbr>API</abbr> Keys 页面; # 点击“移除”按钮。 此时删除按钮恢复正常。 == 为什么这个问题容易误判 == 这个问题容易被误判为以下几类问题: === 1. API Key 错误 === 因为最开始 <abbr>API</abbr> 返回过: {"error_message":"access unauthorized"} 但这个错误只代表认证失败,不代表后台删除按钮的问题。 正确测试方式是带上 <code>X-Auth-Token</code>: curl -i \ -H "X-Auth-Token: 你的API_KEY" \ <nowiki>http://127.0.0.1:8043/v1/me</nowiki> === 2. 反向代理路径错误 === 如果访问 <code>/v1/me</code> 返回 404,确实可能是路径或反代问题。 但本例中: curl -i <nowiki>http://127.0.0.1:8043/v1/me</nowiki> 返回的是 401,而不是 404。 这说明 <abbr>API</abbr> 路径是存在的,只是没有认证。 === 3. BASE_URL 配置错误 === Miniflux 的 <code>BASE_<abbr>URL</abbr></code> 确实很重要,尤其是经过域名、HTTPS 或子路径访问时。 例如独立子域名部署时: ''environment'': - BASE_URL=<nowiki>https://miniflux.example.com/</nowiki> 如果是子路径部署,例如: <nowiki>https://example.com/miniflux/</nowiki> 则应配置为: ''environment'': - BASE_URL=<nowiki>https://example.com/miniflux/</nowiki> 但本例中,最终故障点并不是 <code>BASE_<abbr>URL</abbr></code>,而是 Cloudflare Rocket Loader 注入脚本与 CSP 冲突。 === 4. Docker 内部 IP 异常 === 后台会话中看到类似: 172.20.0.1 这通常是 Docker 网桥或反向代理容器的 IP,不一定是故障。 如果需要让 Miniflux 识别真实客户端 IP,可以检查反向代理 Header: proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; 必要时还可以配置 Miniflux 信任反代网络: ''environment'': - TRUSTED_REVERSE_PROXY_NETWORKS=172.20.0.0/16 但这同样不是本次删除按钮失效的根因。 == 推荐排查流程 == 如果你也遇到 Miniflux 后台按钮无反应,可以按这个顺序排查: === 第一步:确认 API 是否正常 === curl -i <nowiki>http://127.0.0.1:8043/healthcheck</nowiki> curl -i <nowiki>http://127.0.0.1:8043/v1/me</nowiki> 如果 <code>/healthcheck</code> 返回 200,<code>/v1/me</code> 返回 401,说明服务和 <abbr>API</abbr> 路径基本正常。 === 第二步:确认认证是否正常 === 使用 Basic Auth 测试: curl -i -u '你的用户名:你的密码' \ <nowiki>http://127.0.0.1:8043/v1/me</nowiki> 使用 <abbr>API</abbr> Key 测试: curl -i \ -H "X-Auth-Token: 你的API_KEY" \ <nowiki>http://127.0.0.1:8043/v1/me</nowiki> === 第三步:检查浏览器 Network === 点击按钮后,如果完全没有请求发出,只是 <abbr>URL</abbr> 多了一个 <code>#</code>,说明问题大概率在前端 JavaScript。 === 第四步:检查 Console === 如果看到类似: Refused to load ... rocket-loader.min.js ... Content Security Policy 就优先检查 Cloudflare Rocket Loader。 === 第五步:关闭 Rocket Loader === 关闭后强制刷新页面,再测试后台按钮。 == 总结 == 这次问题的核心不是 Miniflux API,也不是 <abbr>API</abbr> Key 本身,而是 Cloudflare Rocket Loader 与 Miniflux 页面 CSP 冲突。 最终表现为: * <abbr>API</abbr> Key 可以正常使用; * 后台点击“移除”按钮没有请求发出; * <abbr>URL</abbr> 只从 <code>/keys</code> 变成 <code>/keys#</code>; * 控制台出现 Rocket Loader 被 CSP 拒绝加载的错误; * 关闭 Cloudflare Rocket Loader 后问题解决。 如果自建服务后台页面出现“按钮点击无反应”“没有请求发出”“URL 只多了 #”这类现象,不要只盯着后端日志,也要第一时间检查浏览器 Console。很多时候,真正的问题发生在前端脚本执行阶段。
返回
Miniflux脚本异常
。
导航菜单
个人工具
创建账号
登录
命名空间
页面
讨论
大陆简体
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
友情链接
狗窝 - 我的博客
小城的问候
工具
链入页面
相关更改
页面信息