在IIS上使用URL重写来设置响应的Location标头

Joã*_*mes 5 .net iis-7 nat outsystems url-rewrite-module

我在Windows 2008R2 IIS 7环境中部署了.Net应用程序(使用Outsystems平台构建)。该应用程序已经可以正常使用了。它通过HTTPS在端口443上处理请求,我可以毫无问题地访问它。

现在,需要使一些用户能够通过NAT访问它,该NAT配置为在端口8200上处理请求。将请求毫无问题地转发到服务器,除非响应是重定向(HTTP 302)。在这些情况下,将使用为应用程序实际提供服务的端口(即端口443)设置响应的位置标头。当客户端的浏览器尝试访问在位置标头中设置的此URL时,它将失败,因为NAT仅在端口8200中处理请求。

总共:

  • 客户端浏览器访问https://myserver:8200/myapp;
  • NAT转换URL并转发到https://myserver:443/myapp;
  • 应用程序回复302重定向到https://myserver:443/redirect
  • 客户端浏览器访问https://myserver:443/redirect;
  • NAT会阻止此访问,因为它期望使用端口8200。

这是我试图做的;我在IIS中安装了URL重写模块并创建了以下规则:

  • 将请求的主机标头(在这种情况下为https://myserver:8200)存储到服务器变量ORIGINAL_HOST 的入站规则。
  • 出站规则将响应的位置标头(https://myserver:443/redirect)中发送的URL的主机部分替换为存储在我的服务器变量ORIGINAL_HOST中的值。该规则仅在重定向的情况下适用。

我现在面临的问题是,一旦启用此规则,所有AJAX请求都将停止工作,即使该规则不适用于它们,甚至在没有通过NAT访问应用程序时也是如此。发生这种情况时,通过开发人员工具中的IE的“网络”选项卡,我可以看到请求标头和正文正常,响应标头正常,但是响应正文为空,不应如此。另外,如果我尝试使用断点在服务器上调试AJAX请求,则它不会在断点处停止。

因此,我的问题是:使用URL重写是解决NAT / URL问题的最佳方法吗?如果是这样,我该如何解决AJAX的情况?如果没有,那么我该如何解决重定向问题?

*编辑:这是我的规则配置:

先感谢您,

若昂·戈麦斯(JoãoGomes)

cch*_*ain 5

执行所需的最简单的url重写是针对3xx重定向的出站规则。该规则可以使用正则表达式解析位置,并允许您更改端口。我不确定这是否可以完成您打算做的所有事情(如果端口必须是动态的),但它至少应该使您获得最大的收益。

该模式(https?://[^:/]+):?([0-9]+)?(.*)将解析位置,如下所示:

https://sub.host.com:1337/foo/bar?query=true

{R:1} => https://sub.host.com
{R:2} => 1337
{R:3} => /foo/bar?query=true
Run Code Online (Sandbox Code Playgroud)

注意:如果端口不在URL中,{R:2}将为空。

然后对于您的用例,它将在动作中重新组合,重写为:

{R:1}:8200{R:3} => https://sub.host.com:8200/foo/bar?query=true
Run Code Online (Sandbox Code Playgroud)

出站网址重写


在web.config中<system.webServer>

<rewrite>
    <outboundRules>
        <rule name="Redirect to port" preCondition="3xx Redirect">
            <match serverVariable="RESPONSE_LOCATION" pattern="(https?://[^:/]+):?([0-9]+)?(.*)" />
            <action type="Rewrite" value="{R:1}:8200{R:3}" />
        </rule>
        <preConditions>
            <preCondition name="3xx Redirect">
                <add input="{RESPONSE_STATUS}" pattern="3[0-9][0-9]" />
            </preCondition>
            <preCondition name="3xx redirect no query string">
                <add input="{RESPONSE_LOCATION}" pattern="^(.*)(\?.+)$" negate="true" />
                <add input="{RESPONSE_STATUS}" pattern="3[0-9][0-9]" />
            </preCondition>
            <preCondition name="3xx redirect with query string">
                <add input="{RESPONSE_STATUS}" pattern="3[0-9][0-9]" />
                <add input="{RESPONSE_LOCATION}" pattern="^(.*)(\?.+)$" />
            </preCondition>
        </preConditions>
    </outboundRules>
</rewrite>
Run Code Online (Sandbox Code Playgroud)

@ hally9k-也许这也是您想要的?