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

5
我有一个带有嵌套应用程序的网站。假设虚拟目录是'/app',当请求www.mysite.com/app时,会重定向到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
如果您不知道,这似乎是IIS的“功能”[称为Courtesy Redirects](http://support.microsoft.com/default.aspx?scid=kb;en-us;298408)。我一直在寻找解决方法,但没有找到。另请参见:https://dev59.com/VGoy5IYBdhLWcg3wo_gn - Stephen McDaniel
1个回答

5
我可能终于有了答案。这是在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["abc"]变量来做到这一点。子应用程序的默认文件可以读取由子应用程序中的另一个文件编写的变量。根级文件看不到该变量。
对于进一步的规则,我使用Helicon Ape。多年前我开始使用他们的软件,我更喜欢htaccess语法而不是IIS语法。我在IIS中使用上面的规则避免斜杠,并在所有剩余的规则中使用Ape/htaccess进行测试,这似乎有效。

我曾经尝试多次让Ape独自避免重定向,但都没有成功。看起来IIS是第一个进行处理的,所以这个规则需要在IIS中设置,但是其他规则则不需要。

注意:当尝试使用这些规则时,您的浏览器往往会缓存重定向信息。请在“无痕模式”(Chrome)下工作,和/或每次清除浏览器缓存。参见https://dev59.com/t2ox5IYBdhLWcg3whUmm#9204355


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接