使用 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 域
我在 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 域