NGINX 入口注释创建 404

NGINX Ingress Annotations creates 404

我有一个 NGINX Ingress 位于几个 nodejs 服务前面。我想将路径 /graphql 限制为仅 POST 且仅 content-type=application/json

我添加了以下注释,它似乎在限制方面有效,但现在有效请求 return 404

    nginx.ingress.kubernetes.io/server-snippet: |
      location /graphql {
      limit_except OPTIONS POST {
         deny all;
      }

      if ($http_content_type != "application/json") {
          return 403;
      }
  }

我认为问题在于您的 location {} 块没有像 nginx 入口中定义的常规路径那样的上游。 从 ingress-nginx-controller pod:

获取 nginx ingress 配置
$ kubectl exec -n your-ingress-nginx-namespace ingress-nginx-controller-xxx-xxx -- cat /etc/nginx/nginx.conf

并检查其他位置 {} 块以查找您的 /graphql 位置 {} 配置可能需要的内容。

下面的基本nginx.ingress.kubernetes.io/server-snippet对我有用(除了POST和content-type=application/json return 403状态码,有效请求OK ):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cms-ingress-service
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/server-snippet: |
      location /graphql {
          limit_except OPTIONS POST {
             deny all;
          }
          if ($http_content_type != "application/json") {
              return 403;
          }
          set $proxy_upstream_name "default-nginx-80";
          proxy_pass http://upstream_balancer;
      }
spec:
...

此外,请注意 If is Evil... when used in location context
因此,我建议您在将其投入生产之前彻底测试您的最终配置。