Nginx入口控制器未设置X-Forwarded-Host

时间:2019-06-25 07:03:07

标签: nginx kubernetes-ingress nginx-ingress

我已经使用微服务设置了Nginx Ingress Controller;该微服务使用Hateoas产生链接;我设置了以下Ingress。

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只会将标头添加到响应中,而不是在向服务器发送的请求中。

1 个答案:

答案 0 :(得分:0)

我认为x-forwaded- *标头在ingress-nginx中默认设置。当到达应用程序时,您可能需要将x-forward-proto标头更新为“ https”。不幸的是,在进入时有标准的注释可用,以覆盖x-forwarded- *标头。但是,有一种解决方法可以解决此问题。

您可以编写自定义的入口插件,该插件将负责重写x-forwarded- *标头。如this comment

中所述

更改标题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