使用URL重写来更改URL的一部分

时间:2013-05-18 22:34:09

标签: iis url-rewriting

我正在尝试在IIS 8.0上使用URL Rewrite来重写开发人员计算机上的现有URL。原因是我不想更改现有(旧)代码。

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

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

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

1 个答案:

答案 0 :(得分:4)

您的规则需要更改为:

<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之前的任何内容(0个或更多字符)以及(.*)$之后的任何内容,直至结束。

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

之后{1}}