使用Ngrok暴露本地IIS时出现ERR_TOO_MANY_REDIRECTS错误求助
解决Ngrok+IIS的ERR_TOO_MANY_REDIRECTS问题
这个错误是请求在Ngrok和IIS之间陷入了无限重定向循环,结合你的情况,核心问题肯定出在IIS的配置和Ngrok转发逻辑的冲突上,和酒店WiFi无关(毕竟请求已经能到本地机器)。下面是具体排查和修复方案:
HTTPS强制跳转的协议不匹配
如果你在IIS里设了HTTP转HTTPS的规则,很容易触发循环:比如你用ngrok http 80转发HTTP端口,用户访问Ngrok提供的HTTPS域名时,Ngrok会把请求转成HTTP发给IIS;IIS收到HTTP请求后又强制跳转到HTTPS,Ngrok再把跳转请求转回HTTP,反复循环。
修复:- 要么修改IIS的重写规则,加上对
{HTTP_X_FORWARDED_PROTO}的判断,当这个头部是https时不跳转,规则代码如下:<rule name="HTTP to HTTPS redirect" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="off" /> <add input="{HTTP_X_FORWARDED_PROTO}" pattern="https" negate="true" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" /> </rule> - 要么直接用Ngrok转发HTTPS端口:
ngrok http https://localhost:443,保持协议一致。
- 要么修改IIS的重写规则,加上对
IIS站点绑定的主机名不兼容
如果你给IIS站点绑定了特定主机名(比如localhost),Ngrok转发过来的请求Host头是它自己的公网域名,IIS会把请求路由到默认站点,要是默认站点又有跳转指向你的目标站点,就会形成循环。
修复:给目标站点添加绑定,主机名留空(接受任意Host头),或者临时把Ngrok的公网域名加到绑定里(注意每次Ngrok重启域名会变,要更新)。Ngrok转发的Host头不对
可以试试在启动Ngrok时指定Host头,强制匹配IIS站点的绑定:ngrok http 80 --host-header="localhost"把
localhost换成你IIS站点绑定的主机名就行。排查IIS的重写规则
临时禁用目标站点的所有URL重写、重定向规则,测试Ngrok访问是否正常。如果正常,再逐个启用规则,找出触发循环的那条,调整规则逻辑。
内容的提问来源于stack exchange,提问作者Ayo Adesina
相关产品推荐
相关产品推荐

