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

jed*_*jay 4 asp.net iis redirect iis-7 url-rewriting

我有一个带有嵌套应用程序的网站。假设嵌套应用程序的虚拟目录是“/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>
Run Code Online (Sandbox Code Playgroud)

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

有解决办法吗?

goo*_*eye 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>
Run Code Online (Sandbox Code Playgroud)

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

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

空请求规则是选择 www.mysite.com/app,没有别的,它执行 default.aspx 页面。

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

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

我曾多次尝试让 Ape 独自一人以避免重定向,但无济于事。似乎 IIS 先行,所以此规则需要在 IIS 中,但其余规则不需要。

注意:尝试这些规则时,您的浏览器往往会缓存重定向。在“隐身模式”(Chrome)下工作,和/或每次都清除浏览器缓存。见/sf/answers/644304881/