我正在尝试在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>
我想我应该使用一些正则表达式魔法。
答案 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}
在(.*)