如何解决通过 NGINX Kubernetes Ingress 将 HTML 添加到后端响应正文 背景
背景
我们托管了一个专有的网络应用程序,我们喜欢为我们的 CD(主要是颜色)定制基本的应用程序。由于应用程序不支持此功能并且我无权访问源代码,因此我想创建一个自定义 css 样式表,并通过操纵它的入口(= 将 css/样式表注入 DOM)将其包含在应用程序中。
http_sub_module
Kubernetes 的 Nginx 入口控制器
http_sub_module
似乎与 Apaches mod_substitute
相似。当我在 Nginx 入口 pod 中执行 Nginx -V
时,配置参数中列出了 --with-http_sub_module
,因此它必须在当前部署的 1.19.2 版本中可用。
我使用 subs_filter
(而不是 sub_filter
)找到了 a similar question。似乎 the one with s is from nginx plus,也记录了 here。那里的所有链接示例都使用 subs_
,其中 regular community documentation 使用 sub_filter
。他们都没有错误地工作,如果没有加号订阅可用,我想加号是一个别名。
由于 sub_filter
似乎不起作用,我尝试了它们两个都没有成功:
annotations:
kubernetes.io/ingress.class: "Nginx"
Nginx.ingress.kubernetes.io/rewrite-target: /
Nginx.ingress.kubernetes.io/configuration-snippet: |
#subs_filter_once on;
#subs_filter_types 'text/html';
# subs_filter 'en' 'de';
# subs_filter '</body>' '<h1>TEST</h1></body>';
sub_filter '</body>' '<h1>TEST</h1></body>';
我检查/尝试的其他内容
应用了配置片段。我查看了 Nginx 入口 pod,我的应用程序的服务器 vhost 块在 sub_filter
位置块内具有 subs_filter
//
指令。
过滤的默认类型是 sub_filter_types text/html
。该网站返回 Content-Type: text/html
因此它应该匹配。可以肯定的是,我还在代码段中设置了 sub_filter_types "text/html";
。甚至 *
根据文档匹配任何 mime 类型,两者都没有任何区别。
这个模块不支持 k8s 使用的 mod_proxy
吗?我无法想象,因为该模块相对较旧,而且当 Nginx 充当反向代理时,我看不出为什么它不应该工作,因为它也需要访问 HTML 标头/正文。
解决方法
发现问题完全不同:应用程序支持gzip,因此启用了此压缩。但 http_sub_module
不支持 gzip,如 documented here。它仅适用于纯文本响应。如果响应被压缩,模块就什么都不做。这解释了为什么它不起作用并且没有错误。
幸运的是,通过设置以下标头,无需对应用程序进行任何修改即可轻松禁用压缩:
proxy_set_header Accept-Encoding "";
如果将其添加到 nginx.ingress.kubernetes.io/configuration-snippet
部分,则它仅接受纯文本,并且每个符合规范的应用程序都会遵守这一点。
但这并不意味着我们不能使用任何压缩。 Gzip过滤器可以从入口到用户使用,只是不支持从入口到应用。
完整的示例注释片段
ingres:
# ...
annotations:
kubernetes.io/ingress.class: "nginx"
# http://nginx.org/en/docs/http/ngx_http_sub_module.html
nginx.ingress.kubernetes.io/configuration-snippet: |
sub_filter "</body>" "<style>body{ color: red !important; }</style></body>";
# The http_sub_module doesn't support compression from the ingress to the backend application
proxy_set_header Accept-Encoding "";
这将在结束正文标记之前应用样式块,如下所示:
<style>body{ color: red !important; }</style></body></html>
为了高效使用,我们可以在此处包含一个指向自定义 css 文件的链接,它会根据我们的需要覆盖应用程序设计。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。