微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过 NGINX Kubernetes Ingress 将 HTML 添加到后端响应正文 背景

如何解决通过 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 举报,一经查实,本站将立刻删除。