首页 > 解决方案 > 在 Kubernetes NGINX 入口控制器后面使用相对 URL 托管 webapp

问题描述

我在 NGINX入口控制器后面的 Kubernetes 1.13 集群中托管一个 Web 应用程序。Ingress指定path: /my-webapp/?(.*)和这样annotations: { nginx.ingress.kubernetes.io/rewrite-target: /$1 }可以从集群外部访问 webapp http://my-cluster/my-webapp。(入口控制器公开为my-cluster。)

剩下的一个问题是 webapp 包含引用例如 CGI 脚本和 CSS 样式表的“相对”URL。例如,<link rel="stylesheet" type="text/css" href="/my-stylesheet.css" />当前不加载样式表。我认为这是因为浏览器在错误的 URL 处请求它(http://my-cluster/my-webapp/my-stylesheet.css应该是正确的)并且需要更多注释。

这种情况下正确的配置是什么?

更新检查器显示浏览器当前从 URL 请求样式表http://my-cluster/my-stylesheet.css,这确实是错误的,需要修复。

更新 看起来像是一个与 NGINX 反向代理相关的问题,而不是特别是 Kubernetes NGINX 入口控制器。我想知道建议的食谱是否以及如何在这种特殊情况下也可以使用。首先,我尝试切换到引用样式表的相对 URL(根据已接受答案中的配方 One),但这到目前为止还没有奏效: <link rel="stylesheet" type="text/css" href="my-stylesheet.css" />,浏览器显然仍然试图从 获取样式表http://my-cluster/my-stylesheet.css,尽管它显示http://my-cluster/my-webapp在 URL 栏中,检查器报告的 URL 与baseURI.

标签: kubernetes-ingressnginx-reverse-proxy

解决方案


Now this combination of annotations seems to do the trick:

annotations:
  nginx.ingress.kubernetes.io/configuration-snippet: |
    proxy_set_header Accept-Encoding "";
    sub_filter '<head>' '<head> <base href="/my-webapp/">';
  nginx.ingress.kubernetes.io/rewrite-target: /$1
  nginx.ingress.kubernetes.io/use-regex: "true"

I am currently using this version of the ingress controller:

-------------------------------------------------------------------------------
NGINX Ingress controller
  Release:    0.23.0
  Build:      git-be1329b22
  Repository: https://github.com/kubernetes/ingress-nginx
-------------------------------------------------------------------------------

推荐阅读