从IIS中嵌套应用程序的虚拟目录根目录中删除尾部斜杠

时间:2014-03-13 15:38:21

标签: asp.net iis redirect iis-7 url-rewriting

我有一个嵌套应用程序的网站。假设嵌套应用程序的虚拟目录是'/ app'。当向www.mysite.com/apps发出请求时,会重定向到www.mysite.com/app/,可能是因为虚拟目录不为空。我在嵌套应用程序的web.config中设置了一个规则,以从所有URL中删除尾部斜杠,但这不会影响嵌套应用程序的根路径。是否有一种方法(可能是IIS中的设置)重写或重定向到没有尾部斜杠的根?我尝试了许多重写和重定向规则无济于事。

以下是删除尾部斜杠的规则:

<rule name="Remove trailing slash" stopProcessing="true">
  <match url="(.*)/$" />
  <conditions>
    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
  </conditions>
  <action type="Redirect" redirectType="Permanent" url="{R:1}" />
</rule>

就像我说的,这很有效,但这不会影响根。根目录中有一个default.aspx页面,我想从www.mysite.com/app加载,而不是www.mysite.com/app /.

有解决方法吗?

1 个答案:

答案 0 :(得分:3)

我可能终于有了答案。这是在Windows Server 2008 R2,IIS 7.5上。

解决方案,在IIS中:

  • 禁用子应用程序的默认文档功能。
  • 使用Url Rewrite创建规则以将空请求重写(不重定向)到default.aspx

以下是web.config中的规则,以及禁用默认文档的条目。我使用UI来做这些,这就是它创建的:

<defaultDocument enabled="false" />
<rewrite>
    <rules>
        <rule name="No slash root" enabled="true" stopProcessing="true">
            <match url="^$" />
            <action type="Rewrite" url="default.aspx" />
        </rule>
    </rules>
</rewrite>

问题似乎源于拥有默认文档。当我禁用默认文档时,它从重定向更改为403禁止,这是通常的目录浏览尝试。 然后添加规则以重写空白请求运行默认页面,而不更改浏览器URL。

我刚刚完全禁用了默认文档。可能只是从默认文档列表中删除default.aspx,但我没有尝试过。

空的请求规则正在拿起www.mysite.com/app而没有别的东西,它会执行default.aspx页面。

我做了一些测试,以确保页面仍在子应用程序中执行。我只是想确保它不会以某种方式神奇地认为这是根应用程序中的文件。我这样做是通过创建各种.aspx文件来编写和读取旧的Application [&#34; abc&#34;]变量。子应用程序默认文件可以读取子应用程序中另一个文件写入的变量。根级文件没有看到变量。

对于进一步的规则,我使用Helicon Ape。我几年前开始使用他们的软件,我更喜欢使用htaccess语法而不是IIS语法。我在IIS中使用上面的规则来测试这个以避免使用尾部斜杠,并且对于我所有剩余的规则使用Ape / htaccess,这似乎正在起作用。

我多次尝试让Ape独自避免重定向,但无济于事。似乎IIS是第一位的,所以这个规则需要在IIS中,但其余的规则不需要。

注意:尝试这些规则时,您的浏览器会倾向于缓存重定向。工作在&#34;隐身模式&#34; (Chrome),和/或每次清除浏览器缓存。见https://stackoverflow.com/a/9204355/292060