【问题标题】:Using URL Rewrite on IIS to set response's Location header在 IIS 上使用 URL Rewrite 设置响应的 Location 标头
【发布时间】:2014-08-18 11:47:22
【问题描述】:

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

现在,需要允许一些用户通过 NAT 访问它,该 NAT 配置为在端口 8200 上处理请求。请求被转发到服务器没有问题,除非响应是重定向(HTTP 302)。在这些情况下,响应的 Location Header 设置为应用程序实际服务的端口,即端口 443。当客户端的浏览器尝试访问在 Location Header 中设置的 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 Rewrite 模块并创建了以下规则:

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

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

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

*edit:这是我的规则配置:

在此先感谢您,

若昂·戈麦斯

【问题讨论】:

  • 你能告诉我们你的配置吗?
  • 嗨 NicoD。我已将我的配置添加到帖子中。
  • 你有没有找到一个好的解决方案?看起来应该很容易……杀了我!

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


【解决方案1】:

执行您想要的最简单的 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

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

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

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


在 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 - 也许这也是你要找的?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 2021-09-23
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 2014-10-02
    • 2014-11-29
    相关资源
    最近更新 更多