Loading... # 什么是X-Forwarded-Proto X-Forwarded-For是自定义的HTTP头,携带客户端的原始IP地址,以便在另一端的应用程序知道HTTP头是什么(HTTP/HTTPS)。否则应用程序只能获取到代理的IP地址。一般情况下Nginx的HTTP反向代理使用非标准的头信息来告知上游服务器关于用户的IP地址和其他请求属性。参考[Using the Forwarded header | NGINX](https://www.nginx.com/resources/wiki/start/topics/examples/forwarded/) # 需求 本来我的Keycloak项目配置的proxy是 `reencrypt`模式,此模式下Keycloak只开启自身的HTTPS,而不开启HTTP,但考虑到配置它的HTTPS证书略为麻烦,需要将证书转换为PKCS12格式的,pem格式官方说是支持但是我自己测试的时候发现无法读取(版本15.0~17.0.1)。 考虑到Keycloak内网反代不需要HTTPS也为了日后维护方便不需要每一年去换一次Keycloak的证书,在朋友的建议下尝试将proxy设置为了 `edge`模式,此模式下允许代理通过HTTP与Keycloak之间进行通讯,适合内网环境。本身我的Keycloak项目就没有对外暴露端口。 在配置Nginx通过HTTP反向代理到Keycloak项目的时候发现报403错误,后面查阅Keycloak文档的说是在生产模式下运行的时候必须启用TLS [Keycloak - Server - Configuring Keycloak for production](https://www.keycloak.org/server/configuration-production),也就是HTTPS。但我明明Nginx对外是使用的HTTPS,但Keycloak却不认它,日志也没有相关内容。 后面在Keycloak官方文档 [Keycloak - Server - Using a reverse proxy](https://www.keycloak.org/server/reverseproxy) 提到了Keycloak是需要设置 `X-Forwarded-For` 和 `X-Forwarded-Proto` 来获取HTTP标头的,然后我发现在Nginx的反向代理配置当中少了 `X-Forwarded-Proto` ,也就是Keycloak获取到的标头其实是HTTP,导致Keycloak拒绝连接。。。  # 问题的解决 查阅相关资料与文档之后对自己的Nginx反向代理配置加入了 `proxy_set_header X-Forwarded-Proto https;` 问题解决。 附上我的Nginx反代配置: ``` location { proxy_pass http://IP地址:端口; 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 REMOTE-HOST $remote_addr; } ```  图中Nginx到Keycloak的HTTPS其实依然走的是HTTP连接,但通讯标头是HTTPS,这里我还没抓包看看到底是什么。 # 关于X-Forwarded-Proto一些相关配置 <div class="tip inlineBlock warning"> 不要在反向代理当中使用 `proxy_set_header X-Forwarded-Proto $scheme;` </div> schema 变量仅在需要的时候才会被使用,如果使用 $schema 变量且使用多层代理,则可能会出现不符合预期的问题。例如:如果客户端访问https://example.com,则代理scheme变量储存为HTTPS。 如果代理与下一级代理之间的通信是通过HTTP进行的,则下一级代理会认为是HTTP,后端获取到的标头也会成了HTTP。  参考配置: ``` # 第一种情况 客户端 <-> 代理 <-> 后端 proxy_set_header X-Forwarded-Proto $scheme; # 第二种情况 客户端 <-> 代理 <-> 代理 <-> 后端 # proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; ``` 如果文章有错误的地方欢迎联系我QQ。 Last modification:November 6, 2024 © Allow specification reprint Support Appreciate the author AliPayWeChat Like If you think my article is useful to you, please feel free to appreciate