k8s ingress 转发会把 encode 后的 uri 还原成转义前的字符串

13 天前
 dhq

我有一个 ingress 转发的配置,就是把匹配/dhq 前缀的请求,转发到后端服务, 访问 /dhq/api/v1/%40aa

ingress 转发时会直接 把它还原成 /api/v1/@aa

但我就是不想给他还原,大佬们,有啥经验建议么,目前试了几个 ai 给的答案都不奏效

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 200m
    nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: "60"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "360"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/configuration-snippet: |
      proxy_set_header Accept-Encoding "";
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/enable-rewrite-log: "true"
  name: dhq-ingress
  namespace: monitor
spec:
  ingressClassName: idataexplorer
  rules:
  - http:
      paths:
      - backend:
          service:
            name: dhq-service
            port:
              number: 80
        path: /dhq(/|$)(.*)
        pathType: ImplementationSpecific
1017 次点击
所在节点    Kubernetes
8 条回复
illl
13 天前
请求时双重编码?
xwjlucky
13 天前
mark 一下 感觉这种双重编码解码是个很头疼的问题
dhq
13 天前
@illl 客户端请求的时候会执行一个 urlencode ,像 js 本身有这样的函数,但是 ingress 在拿到编码后的 uri 的时候,会自动给你把 encode 过的字符串给你 decode 还原回去,但我不期望它帮我做这个事情,
feedcode
13 天前
这个不是 ingress 的问题!
你只是恰巧用了 nginx ,解决方法
https://my.f5.com/manage/s/article/K000148648
试试在 configuration-snippet 再加一个
rewrite ^ $request_uri;
dhq
12 天前
@feedcode 昨天又尝试过,但加了这个,它会把 /xxx?aa=bb 修改为 /xxx%3Faa=bb
```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: 200m
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: "60"
nginx.ingress.kubernetes.io/proxy-read-timeout: "360"
# 移除 rewrite-target 和 use-regex 注解
# nginx.ingress.kubernetes.io/rewrite-target: /$2
# nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/enable-rewrite-log: "true"
nginx.ingress.kubernetes.io/configuration-snippet: |
# 新增的重写逻辑
# 1. 将当前 URI 重置为原始的、未解码的 URI
# rewrite ^ $request_uri;

# 2. 对原始 URI 进行重写,剥离/dhq/前缀
# 'break'标志表示停止处理后续的 rewrite 规则,并进行内部转发
rewrite ^/dhq/(.*)$ /$1 break;
```
ca2oh4
12 天前
七层的网络真复杂
feedcode
12 天前
不要 rewrite query parameter

nginx.ingress.kubernetes.io/configuration-snippet: |
if ($request_uri ~ "/dhq/([^\?]*)") {
set $path1 $1;
rewrite ^/dhq/ /$path1 break;
}
dhq
9 天前
@feedcode 没有作用,我 ai 的回答是,nginx 的 rewrite 本身就是会做 uri 的 decode 这一步的,貌似没法避免

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1160280

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX