You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

IIS 10反向代理编码URL段重写问题(HTTP重定向)

解决IIS反向代理下Steam OpenID回调URL错误的问题

嘿,这个问题我太熟了——第三方页面硬编码了本地地址,反向代理后回调URL没跟上,确实让人头大。别慌,咱们不用改第三方的代码,只要给IIS加个出站重写规则就能搞定!

问题根源

第三方网页在生成Steam OpenID跳转链接时,是基于它自己的本地地址localhost:26982构造openid.return_toopenid.realm参数的。你的入站规则只是转发了外部请求,但页面输出的响应内容里,这些编码后的URL并没有被修改,导致Steam认证完成后还是跳回localhost,自然就失效了。

解决方案:添加出站重写规则

我们需要在web.configoutboundRules里新增规则,自动识别响应中编码后的本地URL,把它替换成外部域名的编码版本。下面是修改后的完整配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<clear />
<rule name="ReverseProxyInboundRule1" enabled="true" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern="^sub.domain.com$" />
</conditions>
<action type="Rewrite" url="http://localhost:26982/{R:1}" />
</rule>
</rules>
<outboundRules rewriteBeforeCache="true">
  <!-- 替换编码后的openid.return_to和realm中的localhost地址 -->
  <rule name="ReplaceEncodedLocalhostWithExternalDomain" enabled="true">
    <match filterByTags="A, Form, Img, Link, Script" pattern="http%3A%2F%2Flocalhost%3A26982" />
    <action type="Rewrite" value="http%3A%2F%2Fsub.domain.com" />
  </rule>
  <!-- 如果外部使用HTTPS,替换成https的编码版本(取消注释启用) -->
  <!-- <rule name="ReplaceEncodedLocalhostWithExternalDomainHTTPS" enabled="true">
    <match filterByTags="A, Form, Img, Link, Script" pattern="http%3A%2F%2Flocalhost%3A26982" />
    <action type="Rewrite" value="https%3A%2F%2Fsub.domain.com" />
  </rule> -->
</outboundRules>
</rewrite>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
<add name="strict-transport-security" value="max-age=16070400" />
</customHeaders>
</httpProtocol>
<security>
<requestFiltering allowDoubleEscaping="true" />
</security>
</system.webServer>
</configuration>

规则细节说明

  1. rewriteBeforeCache="true":确保IIS在缓存响应之前就完成重写,避免缓存旧的localhost链接导致后续请求出错。
  2. 匹配与替换逻辑http%3A%2F%2Flocalhost%3A26982http://localhost:26982的URL编码结果,我们直接匹配这个字符串,替换成外部域名的编码版本(http%3A%2F%2Fsub.domain.com对应http://sub.domain.com)。
  3. 标签覆盖范围filterByTags="A, Form, Img, Link, Script"会覆盖页面中所有常见的包含URL的标签,不止是OpenID的跳转链接,确保其他资源请求也能指向外部域名。
  4. HTTPS适配:看你配置了HSTS头,大概率外部地址用的是HTTPS,这时候注释掉HTTP规则,启用HTTPS版的规则即可,替换值改成https%3A%2F%2Fsub.domain.com

测试步骤

  1. 把修改后的web.config保存到IIS站点根目录,IIS会自动加载配置。
  2. 清理浏览器缓存(避免旧页面干扰),访问sub.domain.com的登录页。
  3. 点击登录后,查看跳转的Steam URL中的openid.return_toopenid.realm参数,确认已经变成外部域名的编码版本。
  4. 完成Steam认证,应该就能正常跳回sub.domain.com并完成登录流程了。

额外小贴士

如果第三方页面还有其他地方用到了本地地址(比如API请求、静态资源链接),这个出站规则也会自动替换它们,确保整个页面的资源和请求都能正常指向外部域名。要是遇到更复杂的URL路径,可以调整正则模式,比如用http%3A%2F%2Flocalhost%3A26982(.*)捕获后续路径,替换时保留路径部分:http%3A%2F%2Fsub.domain.com$1

内容的提问来源于stack exchange,提问作者Alex

火山引擎 最新活动