You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ingress-nginx中用Lua脚本拦截路径?配置失效求助

解决ingress-nginx Lua脚本拦截特定路径无效的问题

问题根源

你在server-snippet里手动添加的location /app-2是普通前缀匹配规则,而ingress-nginx会根据Ingress spec中path: /app-2和pathType: Prefix自动生成正则匹配的location(格式为~* ^/app-2(/|$))。按照nginx的location匹配优先级,正则匹配的优先级高于普通前缀匹配,所以请求会被自动生成的location接管,根本不会进入你手动定义的location块,导致Lua拦截脚本完全没执行。

可行解决方法

方法一:修改server-snippet为正则匹配规则

将手动定义的location改成和自动生成规则一致的正则匹配,并且因为server-snippet的内容会被插入到自动生成的location之前,所以会优先匹配执行:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/server-snippet: |
      location ~* ^/app-2(/|$) {
            rewrite_by_lua_block {
              ngx.status = 403;
              ngx.exit(ngx.HTTP_FORBIDDEN);
        }
      }
spec:
  rules:
    - http:
        paths:
          - path: /app-1
            pathType: Prefix
            backend:
              service:
                name: app-1
                port:
                  number: 80
          - path: /app-2
            pathType: Prefix
            backend:
              service:
                name: app-2
                port:
                  number: 80

方法二:用全局snippet加路径判断

如果需要在全局范围内对特定路径做拦截,可使用configuration-snippet插入Lua脚本,通过路径判断只对/app-2生效:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite_by_lua_block {
        if string.sub(ngx.var.uri, 1, 6) == "/app-2" then
          ngx.status = 403
          ngx.exit(ngx.HTTP_FORBIDDEN)
        end
      }
spec:
  rules:
    - http:
        paths:
          - path: /app-1
            pathType: Prefix
            backend:
              service:
                name: app-1
                port:
                  number: 80
          - path: /app-2
            pathType: Prefix
            backend:
              service:
                name: app-2
                port:
                  number: 80

验证操作

修改配置后执行:

kubectl apply -f your-ingress.yaml

等待ingress-nginx控制器更新配置,再执行curl http://A.B.C.D/app-2,此时应该返回403 Forbidden状态码。

内容的提问来源于stack exchange,提问作者Xavier123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 12:05:29