Nginx Ingress能否将405错误改写为200并重写请求转发至源站URL
实现方案
Nginx Ingress完全支持该需求,可通过内置的自定义snippet注解实现,和原生Nginx的配置逻辑完全对齐,不需要修改Nginx Ingress的全局配置,仅调整你的Ingress资源配置即可。
调整后的完整Ingress配置
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: frontend-ingress annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: /$1 # 向Nginx server块注入自定义配置 nginx.ingress.kubernetes.io/server-snippet: | error_page 405 =200 @405; location @405 { # 将请求方法强制修改为GET proxy_method GET; # 匹配原请求对应的后端服务,保留原始URI转发 proxy_pass http://$proxy_host$request_uri; # 继承原有代理头规则,避免请求信息丢失 proxy_set_header Host $host; 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; } 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
配置说明
nginx.ingress.kubernetes.io/server-snippet注解的内容会直接插入到对应域名的Nginx server配置块中,其中error_page 405 =200 @405和你给出的原生Nginx配置作用一致,捕获后端返回的405状态码,重写状态码为200后转发到名为@405的命名location处理。- 命名location@405中通过
$proxy_host变量自动匹配原请求对应的后端服务地址,不需要手动配置多个后端的转发规则,可适配你当前多路径路由到不同服务的场景。
注意事项
- 如果你使用的是K8s 1.19+版本,
extensions/v1beta1版本的Ingress API已废弃,建议替换为networking.k8s.io/v1版本的API,注解部分配置不需要修改。 - 如果仅需要针对部分路径生效该规则,不需要全局配置,可以将
error_page 405 =200 @405写到对应路径的nginx.ingress.kubernetes.io/configuration-snippet注解中即可。
内容的提问来源于stack exchange,提问作者windyxia
相关产品推荐
相关产品推荐

