--- title: "一个字符让我的 authentik CSS 静默失效" description: "我的 authentik 自定义 CSS 看起来完全正确,也匹配到了目标元素,却毫无效果。原因是一个 > 字符被 authentik 转义成了无效文本。" pubDate: 2026-09-20 updatedDate: 2026-10-16 category: devops tags: ["authentik", "css", "self-hosting", "debugging", "browser"] ogImage: /og/zh-authentik-css-greater-than-bug.jpg banner: /banners/authentik-css-greater-than-bug.jpg draft: false --- 我花了一个下午去查一条本该三十秒解决的 CSS 规则。 我想隐藏 authentik 登录页脚里的一行——硬编码的「Powered by authentik」署名。这条规则在我做过的其他项目里从来都是有效的: ```css ul.pf-c-list > li:last-child { display: none !important; } ``` 它毫无作用。不是「看起来有点不对」——那个元素依然完整地显示着。下面 是我追过的四个错误答案、唯一正确的答案,以及我本该第一个就做的调试 动作。 ## 为什么这不只是一行页脚的问题 如果你自托管 authentik,曾经把 CSS 粘进 **System → Brands → Custom CSS** 却完全没效果,那你多半以为自己哪里 写错了。你几乎肯定没写错。样式表被接收、被存储、被送到浏览器、也被 解析了——然后静默失效,你够得着的任何日志里都没有报错。 这是最糟糕的一类 bug:没有反馈回路。这篇文章把这条回路还给你。 ## 错误答案 #1:这是 shadow DOM,CSS 进不去 我的第一个假设。现代 Web Component 常常把标记藏在 shadow root 后面, 普通的文档 CSS 无法跨越那道边界。authentik 的登录页确实由 Web Component 渲染——我在页面源码里见过 `` 和 ``——所以这看起来显然是答案。 我从打包好的 bundle 里把组件定义读出来确认: ```js var oe = class extends L { createRenderRoot() { return this } render() { ... } } ``` `createRenderRoot(){ return this }` 意味着**没有 shadow root**——组件 直接渲染进 light DOM。普通 CSS 完全可以作用于它。 错误答案。继续。 ## 错误答案 #2:CSS 根本没被注入 下一个理论:我的 CSS 压根没进到页面里。我在返回的 HTML 里搜了一个 自己规则里的特征类名: ```