首页 > 解决方案 > 入口可以将 405 重写为原始 url 并将 http-errors 405 更改为 200?

问题描述

入口可以将 405 重写为原始 url 并将 http-errors 更改405200

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: frontend-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - http:
    paths:
    - path: /page/user/(.*)
      pathType: Prefix
      backend:
        serviceName: front-user
        servicePort: 80
    - path: /page/manager/(.*)
      pathType: Prefix
      backend:
        serviceName: front-admin
        servicePort: 80

Ngnix可以通过方法实现访问html页面,post但我想知道如何通过入口实现。

server {
    listen 80;
    # ...
    error_page 405 =200 @405;
    location @405 {
        root /srv/http;
        proxy_method GET;
        proxy_pass http://static_backend;
    }
}

这是一个ngnix实现通过一个post方法来访问一个html页面的例子,405200方法为get

标签: kuberneteskubernetes-ingressnginx-ingress

解决方案


您可以使用服务器片段注释来实现它。

此外,我将您的入口从extensions/v1beta1apiVersion 重写为networking.k8s.io/v1,因为之前启动的 kubernetesv1.22apiVersion被删除:

$ kubectl apply -f ingress-snippit.yaml 
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress

Ingress-snippet-v1.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: frontend-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/server-snippet: | # adds this block to server
      error_page 405 =200 @405;
      location @405 {
        root /srv/http;
        proxy_method GET;
        proxy_pass http://static_backend; # tested with IP since I don't have this upstream
      }
spec:
  rules:
  - http:
      paths:
      - path: /page/user/(.*)
        pathType: Prefix
        backend:
          service:
            name: front-user
            port:
              number: 80
      - path: /page/manager/(.*)
        pathType: Prefix
        backend:
          service:
            name: front-admin
            port:
              number: 80

应用上面的清单并/etc/nginx/nginx.confingress-nginx-controllerpod 中进行验证:

$ kubectl exec -it ingress-nginx-controller-xxxxxxxxx-yyyy -n ingress-nginx -- cat /etc/nginx/nginx.conf | less
...
## start server _
        server {
                server_name _ ;
                
                listen 80 default_server reuseport backlog=4096 ;
                listen 443 default_server reuseport backlog=4096 ssl http2 ;
                
                set $proxy_upstream_name "-";
                
                ssl_certificate_by_lua_block {
                        certificate.call()
                }
                
                # Custom code snippet configured for host _
                error_page 405 =200 @405;
                location @405 {
                        root /srv/http;
                        proxy_method GET;
                        proxy_pass http://127.0.0.1; # IP for testing purposes
                }
                
                location ~* "^/page/manager/(.*)" {
                        
                        set $namespace      "default";
                        set $ingress_name   "frontend-ingress";
                        set $service_name   "front-admin";
                        set $service_port   "80";
                        set $location_path  "/page/manager/(.*)";
                        set $global_rate_limit_exceeding n;
...

推荐阅读