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

时间:2014-06-27 11:21:00

标签: .net iis-7 nat url-rewrite-module outsystems

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

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

总之:

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

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

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

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

所以,我的问题:使用URL Rewrite解决NAT / URL问题的最佳方法是什么?如果是这样,我该如何解决AJAX问题呢?如果没有,那我该如何解决重定向问题?

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

先谢谢你,

JoãoGomes

1 个答案:

答案 0 :(得分:4)

最简单的网址重写可以执行您想要的是针对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

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

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

{R:1}:8200{R:3} => https://sub.host.com:8200/foo/bar?query=true

Outbound URL Rewrite

在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>

@ hally9k - 也许这就是你要找的东西?