【发布时间】:2021-07-28 07:10:14
【问题描述】:
带有 HTTPS 重定向的 Nginx Ingress Controller 尾部斜杠
我正在尝试使用带有 Nginx 入口控制器的入口将请求从 HTTP 重定向到 HTTPS。我的应用是用 Django v3.0.7 编写的,我的 Nginx 控制器是 v0.46.0 和 k8s v1.19.8。
我有以下入口:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: INGRESS-NAME
namespace: INGRESS-NS
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/rewrite-target: /api/v1/$1/
cert-manager.io/cluster-issuer: "ISSUER-NAME"
nginx.ingress.kubernetes.io/permanent-redirect-code: '308'
spec:
tls:
...
rules:
- host: MY-DOMAIN
http:
paths:
- path: /api/v1/?(.*)
pathType: Prefix
backend:
service:
name: SVC-NAME
port:
number: SVC-PORT
https://.../api/v1/get-token/ 的请求,引发此错误:
[05/May/2021:20:39:49 +0000] "POST /api/v1/get-token// HTTP/1.1" 404 => POST 在最后得到一个额外的/。但是使用 HTTP 或 https://.../api/v1/get-token(没有尾随 /)的相同请求很好。
如果我删除
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /api/v1/$1/
重定向会删除尾随 / 并导致 POST 在所有 HTTP POST 请求中变成 GET,从而导致 403 - 方法不允许,如 Nginx 日志中所示:
[05/May/2021:20:54:52 +0000] "POST /api/v1/get-token HTTP/1.1" 308 164
[05/May/2021:20:54:53 +0000] "POST /api/v1/get-token HTTP/1.1" 301 0
[05/May/2021:20:54:53 +0000] "GET /api/v1/get-token/ HTTP/1.1" 405
但 HTTP POST 请求与 http://.../api/v1/get-token//(两个尾随 /)正常工作。
有没有办法解决这个问题? 308 HTTP -> HTTPS 重定向很重要,所以我不能删除它,但是有没有办法强制请求有一个,并且只有一个,尾随 /?谢谢。
【问题讨论】:
-
您是否尝试过从
nginx.ingress.kubernetes.io/rewrite-target: /api/v1/$1/中仅删除一个尾随/? -
是的,但发生的是第二种情况,只有
http://.../api/v1/get-token//有效。
标签: kubernetes-ingress nginx-ingress http-status-code-308