使用 Kubernetes NGINX 入口控制器后面的相对 URL 托管 webapp

Hosting webapp with relative URLs behind Kubernetes NGINX ingress controller

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

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

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

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

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

现在 this 注释组合似乎可以解决问题:

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: /
  nginx.ingress.kubernetes.io/use-regex: "true"

我目前正在使用这个 version 入口控制器:

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

在我的情况下,我必须从 wsdl 服务页面替换 URL-s,这是我的解决方案代码,感谢上面的代码

nginx.ingress.kubernetes.io/configuration-snippet: |
  sub_filter 'http://example.com:80/project/domain/' 'http://example.com:80${PUBLISH_PATH}/project/domain/';
  sub_filter_once off;
  sub_filter_types text/xml;

${PUBLISH_PATH} - 特定于 kuber 域