【发布时间】:2021-05-24 20:33:58
【问题描述】:
我有一个 Nginx 入口控制器在一个 k8s 命名空间上运行, 在另一个 k8s 命名空间上,我定义了一个 pod、一个服务和一个入口资源。 这是入口资源定义:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: general-internal
rules:
- host: example.com
http:
paths:
- path: "/my-app(/|$)(.*)"
backend:
serviceName: my-app-svc
servicePort: 443
现在,当我访问此链接时:
http://example.com/my-app/some-path/
然后一切正常,因为“my-app-svc”知道路径“/some-path/”并返回 200 响应(转发到 http://my-app-svc/some-path,这很好,因为 my-app-svc 没有t 并且不应该知道或关心仅存在于 nginx 入口控制器的 /my-app 前缀,因此它会知道在内部将该请求转发到“my-app-svc”)。
但是当我访问这个链接时(注意最后没有“/”):
http://example.com/my-app/some-path
我从“my-app-svc”服务收到重定向响应,并且“Location”标头包含“/some-path/”,所以重定向到:
http://example.com/some-path/
这不会导致“my-app-svc”服务,因为它没有“/my-app”前缀。
如果 Location 标头是“/my-app/some-path/”而不是“/some-path/”,那么一切正常,因为重定向将是:
http://example.com/my-app/some-path/
这会给我 200 响应。
问题是,当入口控制器向客户端返回重定向响应时,我该怎么做才能在 Location 标头中添加“my-app”前缀?
谢谢
【问题讨论】:
-
你好@Ofir,如果我能正确看到你的 404 错误看起来像入口行为。查看您的重写目标:
/$2。这意味着您正在捕获第二组- path: "/my-app(/|$)(.*)"。您的第二组是(.*)。在您的示例中,您将仅捕获some-path。该组将附加到http://example.com/。所以预期的结果应该是http://example.com/some-path/。如果您想将请求定向到http://example.com/my-app/some-path,请尝试将重写目标更改为/my-app/$2 -
@MikołajGłodziak 嗨,谢谢你的回答,我编辑了我的问题,这样会更清楚。请注意
http://example.com/my-app/some-path/在 k8s 内部转发到http://my-app-svc/some-path/,这是故意的。我使用“/my-app”前缀以使 nginx 入口将请求路由到内部的“my-app-svc”,所以我不想更改“/$2”,我只想要 nginx 入口控制器更改“my-app-svc”返回给客户端的重定向响应,方法是在 Loaction 标头中添加“/my-app”前缀... -
我认为您将 URL 与站点名称混淆了:“
http://example.com/my-app/some-path/forward tohttp: // my-app-svc / some-path /”。根据您的配置,documentationhttp://example.com/my-app/some-path/应重写(转发)为http://example.com/some-path/。你能附上一些截图吗?如果要在位置标头中添加my-app前缀,则确实需要更改/$2。根据您的配置,它可以正常工作。
标签: kubernetes kubernetes-ingress