IIS重定向虚拟目录的URL

时间:2010-04-27 13:40:50

标签: iis-7 url-rewriting

如何在IIS 7.0中为虚拟目录设置重定向网址?我已经安装了最新的url重写模块2.x。

我可以用一个例子解释我的问题:

我的IIS 7.0服务器上有一个网站,www.mysite.com。我决定在我的网站下创建一个指向网站根目录的虚拟目录“sales”。现在我需要为vdir创建一个重定向url。 vdir指向与我的站点根目录相同的虚拟根目录。

最大的想法是我可以访问www.mysite / sales,我会自动重定向到www.mysite.com?productid=200。

我尝试使用重写网址重定向vdir(不是网站),但我总是收到此错误消息:

Cannot add duplicate collection entry of type 'rule' with unique key 
attribute 'name' set to "test".

当我指向虚拟vdir并尝试添加规则时会发生这种情况。

我可以在网站级别添加规则,但规则不起作用。我的意思是网址“www.mysite / sales”给了我以下错误。我知道钥匙是独一无二的。我从web.config检查了它。

这种功能在IIS 6.0中非常容易使用,只需使用鼠标指向vdir并设置属性 - >重定向到网址。

请有人解释在IIS 7.0中执行此操作的正确方法是什么?

2 个答案:

答案 0 :(得分:28)

实际上并不那么容易,但也不是太可怕。

1)创建物理目录而不是虚拟目录。

2)确保您拥有HTTP重定向角色服务。见http://www.iis.net/ConfigReference/system.webServer/httpRedirect

3)打开IIS管理器并浏览到要重定向的物理目录。

4)双击IIS下的“HTTP重定向”图标。

5)选中“将请求重定向到此目的地”框并输入新网址(http://example.com/newPage.html

6)根据需要检查接下来的两个方框;我发现通常需要检查两者。

7)按“应用”按钮。

8)选择网站并在管理网站下“重新启动”。

9)测试。

答案 1 :(得分:2)

发生这种情况的原因是,默认情况下,所有规则配置都从父Web应用程序继承。因此,如果在根网站内定义了规则,则它将在层次结构中的所有后续子网站上继承;除非它被清除。

因此,对于示例,如果IIS应用程序层次结构如下 -

默认网站(根)

<强> | Web应用程序1(VDir1)| Web子应用程序11(VDir2)

<强> | Web应用程序2(VDir3)

具有名称&#39;测试&#39;的规则如果存在于Root应用程序中,它将继承到Web Application 1,Web Application 11和Web Application 2

在您的情况下,Web应用程序11(VDir2)与(VDir1)在物理上位于相同的位置。因此,两个目录的IIS配置相同,因为它共享相同的Web.config文件。

因此,添加到Web.config文件的任何新规则将自动应用于这两个虚拟目录(VDir1和VDir2)。并且由于默认情况下规则会被继承,因此IIS中的规则引擎会在解析规则时发现它是一个问题,因为它已经通过继承存在。

可能的解决方案是添加&lt;清除/&gt;在web.config文件中添加任何规则之前标记,以便清除任何继承的规则。

<rewrite>
   <rules>
     <clear/>
     <rule name="test" stopProcessing="true">
        <match xxx />
        <action xxx />
     </rule>
   </rules>
</rewrite>

但是,我更喜欢&lt;删除姓名=&#39;规则名称&#39; /&GT;标记而不是仅删除需要在继承的配置中添加的规则。这将确保根网站上的所有其他规则在层次结构中继承;只有这个新规则被(有点)覆盖。

<rewrite>
   <rules>
     <remove name="test"/>
     <rule name="test" stopProcessing="true">
        <match xxx />
        <action xxx />
     </rule>
   </rules>
</rewrite>