4

我正在尝试使用 IIS 8.0 上的 URL 重写来重写开发人员机器上的现有 URL:s。这样做的原因是我不想更改现有(旧)代码。

我想要实现的是在响应流中更改以下代码:

<a href="http://www.foo.com/path/page.asp?a=1">Foo Page</a>

进入:

<a href="http://www.foo.localhost/path/page.asp?a=1">Foo Page</a>

但是当我尝试时,我最终得到:

<a href="foo.localhost">Foo Page</a>

众所周知,这不是一个非常令人满意的结果。

那么 - 我该如何正确地进行重写以实现我想要做的事情?

我知道有更好的方法来做到这一点,使用应用程序变量等,但这是一个旧的解决方案,我不想过多地混淆应用程序本身。我想将更改保持在最低限度。至少开始。

我尝试的规则如下所示:

<system.webServer>
  <rewrite>
    <outboundRules>
      <rule name="foo.com" enabled="true">
        <match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="foo.com" />
        <action type="Rewrite" value="foo.localhost" />
      </rule>
    </outboundRules>
  </rewrite>
</system.webServer>

我想我应该使用一些正则表达式魔法。

4

1 回答 1

6

您的规则需要更改为:

<rule name="foo.com" enabled="true">
  <match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="^(.*)foo.com(.*)$" />
  <action type="Rewrite" value="{R:1}foo.localhost{R:2}" />
</rule>

在模式中,^(.*)将匹配从之前开始foo.com(.*)$之后foo.com直到结束的任何内容(0 个或多个字符)。

然后您可以在 中使用反向引用action,其中{R:1}将获取(.*)之前匹配的值foo.com和之后匹配{R:2}的值(.*)foo.com

于 2013-05-19T02:44:03.417 回答