nginx - 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 只会将标头添加到响应中,而不是添加到服务器的请求中。
解决方案
我认为 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
推荐阅读
- c++ - 为什么 libtorch 张量赋值需要这么多时间?
- c# - 在 C# 中合并两个对象的有效方法
- entity-framework-core - 在实体框架代码第一种方法中创建外键的问题
- mysql - 获取MySQL中多个表的UNION select的汇总行
- javascript - 如何为每个用户生成一个唯一的 URL 目录?
- css - 动态反应去除空间
- google-cloud-platform - GCP 内部 http(s) 负载平衡器在 300 秒后超时
- python - 熊猫,我想取另一个表的列,并且对于该列的每个值,每个月在另一个表中跟踪它
- python - VSCode绿色运行按钮的键绑定?
- r - 有没有一种简单的方法可以将列表转换为 R 中的列数据框?