首页 > 解决方案 > Nginx Ingress Controller 没有设置 X-Forwarded-Host

问题描述

我已经用我的微服务设置了 Nginx 入口控制器;该微服务使用 Hateoas 生成链接;我有以下入口集。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/configuration-snippet: |
      more_set_headers "server: imemywork";
    nginx.org/ssl-services: "mic-ser-service"
    nginx.org/client-max-body-size: "1024m"
    nginx.ingress.kubernetes.io/server-snippet: |
      location /service(|/)(.*) {
        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 https;
        proxy_set_header X-Forwarded-Host  $host/service;
        proxy_set_header X-Forwarded-Port  $server_port;
      }
  name: mic-ser-ingress
spec:
  tls:
    - hosts:
      - imemywork.com
      secretName: mic-ser-tls-certificate
  rules:
    - host: api.imemywork.com
      http:
        paths:
        - path: /service(|/)(.*)
          backend:
            serviceName: mic-ser-service
            servicePort: 8080

请求中没有设置任何 X-Forwarded-* 标头;由于没有设置这些,HATEOAS 链接是使用 http 和浏览器发送的主机生成链接;我是否将它们设置在错误的位置?我还尝试将位置块移动到配置片段下,但没有运气;还有什么,我需要在 Nginx Ingress 控制器中设置/启用吗?

Bts,在 configuration-snippet 下拥有 more_set_header 只会将标头添加到响应中,而不是添加到服务器的请求中。

标签: nginxkubernetes-ingressnginx-ingress

解决方案


我认为 x-forwaded-* 标头默认设置在 ingress-nginx 中。当它到达您的应用程序时,您可能希望将 x-forwarded-proto 标头更新为“https”。不幸的是,目前在入口中没有可用的标准注释来覆盖 x-forwarded-* 标头。但是,有一种变通方法可用于解决此问题。

您可以编写自定义入口插件,该插件将负责重写 x-forwarded-* 标头。如本评论所述

在不使用自定义模板的情况下更改标头 X-Forwarded-Port 的值可以通过插件来完成。 https://github.com/kubernetes/ingress-nginx/tree/master/rootfs/etc/nginx/lua/plugins

local ngx = ngx

local _M = {}

function _M.rewrite()
  if ngx.var.http_cf_connecting_ip then
    ngx.log(ngx.ERR, "Changing x-forwarded-port to 443")
    ngx.var.pass_port = 443
  end
end

return _M

更改变量的条件可以检查任何其他标头(例如将更改限制为特定主机)使用 configmap 可以将插件挂载为文件 https://github.com/kubernetes/ingress-nginx/blob/ master/charts/ingress-nginx/values.yaml#L396-L404


推荐阅读