can ingress rewrite 405 to the origin url and change the http-errors 405 to 200?

Viewed 242

Can ingress rewrite 405 to the origin url and change the http-errors 405 to 200?

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 can realize that visit a html page by a post method but I want to know how to realize by ingress.

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

This is an e.g. that ngnix realize that visit a html page by a post method to change 405 to 200 and change the method to get

1 Answers

You can use server snippet annotation to achieve it.

Also I rewrote your ingress from extensions/v1beta1 apiVersion to networking.k8s.io/v1, because starting kubernetes v1.22 previous apiVersion is be removed:

$ 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

Applying manifest above and verifying /etc/nginx/nginx.conf in ingress-nginx-controller pod:

$ 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;
...
Related