Keycloak搭配IIS反向代理8010转60606时重定向过多问题
IIS反向代理Keycloak出现ERR_TOO_MANY_REDIRECTS重定向循环的解决方法
重定向循环的核心原因是IIS反向代理未正确传递请求路径和转发头部,导致Keycloak无法识别外部访问的真实地址,反复生成指向错误地址的重定向,最终引发循环。以下是具体修复步骤:
一、修正IIS的web.config配置
1. 完善Rewrite规则的路径传递
原规则未将请求的具体路径传递给Keycloak,导致所有请求都被转发到根地址,触发错误重定向。修改action节点的url参数:
<action type="Rewrite" url="http://localhost:8010/{R:1}" logRewrittenUrl="true" />
{R:1}会将匹配到的URL路径(如admin)同步传递给Keycloak,确保请求路径正确映射。
2. 配置转发头部的Server变量
Keycloak需要通过X-Forwarded-*头部识别外部请求的真实协议、主机和端口,需先在IIS管理器中开启允许修改这些变量:
- 打开IIS管理器 → 目标站点 → URL重写 → 右侧「视图服务器变量」 → 添加以下变量:
HTTP_X_FORWARDED_PROTOHTTP_X_FORWARDED_HOSTHTTP_X_FORWARDED_PORT
然后在web.config的serverVariables节点中添加配置:
<serverVariables> <set name="HTTP_X_FORWARDED_PROTO" value="http" /> <set name="HTTP_X_FORWARDED_HOST" value="localhost" /> <set name="HTTP_X_FORWARDED_PORT" value="60606" /> </serverVariables>
3. 添加Outbound规则修正重定向地址
Keycloak可能返回指向自身8010端口的重定向地址,需通过Outbound规则替换为外部访问的60606端口:
在<rewrite>节点下新增<outboundRules>配置:
<outboundRules> <rule name="Fix Keycloak Redirect Location" preCondition="IsRedirect"> <match serverVariable="RESPONSE_Location" pattern="http://localhost:8010/(.*)" /> <action type="Rewrite" value="http://localhost:60606/{R:1}" /> </rule> <preConditions> <preCondition name="IsRedirect"> <add input="{RESPONSE_STATUS}" pattern="3\d\d" /> </preCondition> </preConditions> </outboundRules>
修改后的完整web.config:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Reverse Proxy to Auth" enabled="true" stopProcessing="true"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> <action type="Rewrite" url="http://localhost:8010/{R:1}" logRewrittenUrl="true" /> <serverVariables> <set name="HTTP_X_FORWARDED_PROTO" value="http" /> <set name="HTTP_X_FORWARDED_HOST" value="localhost" /> <set name="HTTP_X_FORWARDED_PORT" value="60606" /> </serverVariables> </rule> </rules> <outboundRules> <rule name="Fix Keycloak Redirect Location" preCondition="IsRedirect"> <match serverVariable="RESPONSE_Location" pattern="http://localhost:8010/(.*)" /> <action type="Rewrite" value="http://localhost:60606/{R:1}" /> </rule> <preConditions> <preCondition name="IsRedirect"> <add input="{RESPONSE_STATUS}" pattern="3\d\d" /> </preCondition> </preConditions> </outboundRules> </rewrite> </system.webServer> </configuration>
二、调整Keycloak配置
修改Keycloak的配置文件,确保代理相关设置匹配IIS的转发规则:
health-enabled=true # 仅保留主机和端口,无需前缀http:// hostname=localhost:60606 # 明确使用xforwarded头部(对应IIS传递的X-Forwarded-*系列头部) proxy-headers=xforwarded # 关闭严格主机名重定向检查,避免触发不必要的重定向 hostname-strict-redirects=false http-port=8010 http-enabled=true
三、测试验证
- 重启IIS站点和Keycloak服务
- 访问
http://localhost:60606,确认页面正常跳转到/admin且无重定向循环错误
内容的提问来源于stack exchange,提问作者Stas BZ
相关产品推荐
相关产品推荐

