Mod rewrite k8s nginx ingress重写目标批注未按预期工作

Mod rewrite k8s nginx ingress重写目标批注未按预期工作,mod-rewrite,nginx,kubernetes,Mod Rewrite,Nginx,Kubernetes,在Minikube中运行时,我有以下入口,以及必要的后端: apiVersion: extensions/v1beta1 kind: Ingress metadata: name: my-ingress annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - http: paths

在Minikube中运行时,我有以下入口,以及必要的后端:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
        - path: /config/
          backend:
            serviceName: api-gateway
            servicePort: web
其目的是为网关的web UI提供服务,该UI期望路径为
/
,否则它会假定它是逻辑路径,并尝试将请求转发到正确的微服务

路径的重写没有像我预期的那样工作。它不会将
/config/
替换为
/
。我误解了吗

在nginx控制器的日志中,我看到:

192.168.99.1 - [192.168.99.1] - - [13/Dec/2017:08:54:11 +0000] "GET /config HTTP/1.1" 301 185 "-" "curl/7.55.1" 78 0.000 [-] - - - -
192.168.99.1 - [192.168.99.1] - - [13/Dec/2017:08:54:11 +0000] "GET /config/ HTTP/1.1" 404 154 "-" "curl/7.55.1" 79 0.010 [dev-api-gateway-web] 172.17.0.10:8080 143 0.010 404
这告诉我,
/config
的请求被重写为
/config/
,并导致404


如何将
/config
重写为
/

您误解了示例。通过配置,对重写目标的请求
/
将被重写为
/config/
,而不是相反。因此,您需要切换路径:使用
/config
作为重写目标,并在规则中设置
/
路径


因此,重写目标始终是外部请求的目的地,服务/pod请求的规则路径

我想我会的。如果我将
/config
作为重写目标,那么不包含
/config
的请求会发生什么情况?例如,对
/api
的请求,假设我有
/api
的规则和后端,那么您需要另一个入口,因为一个入口只能有一个重写目标。但是同一主机可以有多个入口,这没有问题。如果说重写路径(例如
/config
)被
/
替换,则入口中的任何规则都将根据重写的请求路径应用,这不是更准确吗?不确定重写是否和如何使用多个规则。。。但我不希望具有重写目标
/config
的入口能够匹配到
/api
的任何外部请求。我认为
/api
的规则将与
/config/api
的请求相匹配。但我从未试过。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - http:
        paths:
        - path: /config/(.+)
          backend:
            serviceName: api-gateway
            servicePort: web