IIS 反向代理重写编码 url 段(HTTP 重定向)
IIS reverse proxy rewrite encoded url segement (HTTP redirect)
我使用 IIS 10 作为反向代理来托管网页(3 方,我无法修改代码)。
本地:localhost:26982
外部:sub.domain.com
外部请求重定向到本地实例。为此,我使用以下重写规则 (web.config):
<?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>
</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>
当用户尝试在页面上登录时,它会重定向到一个 OpenID 提供商(Steam - 使用 HTTP302 - header 中的 return URL)。不幸的是,路径中编码的 return url
仍然包含 http://localhost:26982
(编码为:http%3A%2F%2Flocalhost%3A26982
)而不是 http://sub.domain.com
。
request/redirect 如下所示:
当我在 localhost
上试用它时,它看起来是一样的,而且它工作正常。尽管如此,当身份验证成功时,由于显而易见的原因,使用 sub.domain.com
时重定向不起作用。
解码 => 重写 => re-encode URL 路径段的正确方法是什么?
如果有人对此也有疑问,我通过反复试验找到了可行的解决方案。
<outboundRules>
<rule name="Rewrite Header" preCondition="IsRedirect">
<match serverVariable="RESPONSE_Location" pattern="^https://(steamcommunity.com)/(.*)(return_to=http%3A%2F%2Flocalhost%3A26982)(.*)(realm=http%3A%2F%2Flocalhost%3A26982)(.*)" />
<conditions>
<add input="{R:1}" pattern="steamcommunity.com" />
</conditions>
<action type="Rewrite" value="https://{R:1}/{R:2}return_to=https%3A%2F%2Fsub.domain.com{R:4}realm=https%3A%2F%2Fsub.domain.com{R:6}" />
</rule>
<preConditions>
<preCondition name="IsRedirect">
<add input="{RESPONSE_STATUS}" pattern="3\d\d" />
</preCondition>
</preConditions>
</outboundRules>
这将使用新值重写任何 HTTP 3XX 重定向位置。
如果有更好的解决方案,请告诉我,但目前,这对我有用。
我使用 IIS 10 作为反向代理来托管网页(3 方,我无法修改代码)。
本地:localhost:26982
外部:sub.domain.com
外部请求重定向到本地实例。为此,我使用以下重写规则 (web.config):
<?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>
</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>
当用户尝试在页面上登录时,它会重定向到一个 OpenID 提供商(Steam - 使用 HTTP302 - header 中的 return URL)。不幸的是,路径中编码的 return url
仍然包含 http://localhost:26982
(编码为:http%3A%2F%2Flocalhost%3A26982
)而不是 http://sub.domain.com
。
request/redirect 如下所示:
当我在 localhost
上试用它时,它看起来是一样的,而且它工作正常。尽管如此,当身份验证成功时,由于显而易见的原因,使用 sub.domain.com
时重定向不起作用。
解码 => 重写 => re-encode URL 路径段的正确方法是什么?
如果有人对此也有疑问,我通过反复试验找到了可行的解决方案。
<outboundRules>
<rule name="Rewrite Header" preCondition="IsRedirect">
<match serverVariable="RESPONSE_Location" pattern="^https://(steamcommunity.com)/(.*)(return_to=http%3A%2F%2Flocalhost%3A26982)(.*)(realm=http%3A%2F%2Flocalhost%3A26982)(.*)" />
<conditions>
<add input="{R:1}" pattern="steamcommunity.com" />
</conditions>
<action type="Rewrite" value="https://{R:1}/{R:2}return_to=https%3A%2F%2Fsub.domain.com{R:4}realm=https%3A%2F%2Fsub.domain.com{R:6}" />
</rule>
<preConditions>
<preCondition name="IsRedirect">
<add input="{RESPONSE_STATUS}" pattern="3\d\d" />
</preCondition>
</preConditions>
</outboundRules>
这将使用新值重写任何 HTTP 3XX 重定向位置。
如果有更好的解决方案,请告诉我,但目前,这对我有用。