URL 重写导致重定向循环

URL Rewrite causing redirect loop

今天在旧的 .Net Webforms 网站中设置 URL 重写时遇到一个问题让我很沮丧(编辑:这是一个网站项目,而不是 Web 应用程序项目,如果它正在制作区别)。我正在使用的网站链接很多,所有链接都链接到 "webroot.com/default.aspx" 而不仅仅是 "webroot.com"。我们想要设置(某处,此时我不关心它是在 global.asax 作为重定向还是 web.config)一个 URL 重写从 /default.aspx 到 /.

我已经尝试通过 global.asax:

在代码中进行设置
if (Request.Url.PathAndQuery.ToLower().Contains("/default.aspx"))
  Response.RedirectPermanent("/" + Request.Url.Query, true);

这会导致重定向循环,我完全理解为什么尝试它是一个愚蠢的想法。没有其他目录有 default.aspx,所以我现在不担心抓到其他目录。

我尝试在 system.webServer 节点中通过 web.config 设置 URL 重写,见此处:

<rewrite>
  <rules>
    <rule name="RemoveDefaultAspxFromRoot" stopProcessing="true">
      <match url="default.aspx" ignoreCase="true" />
      <action type="Rewrite" url="/" appendQueryString="true" />
    </rule>
  </rules>
</rewrite>

这导致了同样的问题,这让我感到困惑,因为我认为重写不会执行重定向,但显然它会执行重定向?

我尝试在规则中添加以下内容作为巫毒博客-post 想法:

<conditions logicalGrouping="MatchAll">
  <add input="{REMOTE_PORT}" pattern=".*" />
</conditions>

没有骰子;仍然陷入重定向循环。

我什至通过手动将 URL Rewrite 模块安装到 IIS 并通过 gui 在那里设置规则,可以在这里看到:

http://i.imgur.com/ovYpfhM.png

我仍然遇到重定向问题。

任何人都可以看到我遗漏的任何内容,或者有其他建议吗?奇怪的是,这个问题似乎可以通过使用重写操作为其他人解决,但它对我不起作用。

我已经在 IIS7 上尝试了这些解决方案,方法是在本地发布并通过 IIS 进行设置,然后通过 VS2013 进行 IIS Express 设置。我们的生产服务器使用 IIS7.

IIS有一个"default"文档功能,难道是 页面 default.aspx 是此列表的一部分,尽管您正在重新路由 到“/”,然后又转换为 "default.aspx"。然后通过导致循环的重定向规则将其转换为“/”。

查看您的 ApplicationHost.config 文件了解全局规则。 另请参阅此 url,它记录了规则的层次结构。

"The evaluation is performed in a parent-to-child order, which means that parent rules are evaluated first and the rules defined on a last child level are evaluated last." - http://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference

尝试替代重定向规则:

在根目录中创建一个名为“notdefault.aspx 的单独页面,并将所有默认值重新路由到新创建的页面。(将 default.aspx 复制到 nodefault.aspx)

另请参阅此 link 以获取更多信息以控制默认值:https://technet.microsoft.com/en-us/library/cc753615(v=ws.10).aspx

我最终将以下内容添加到我的 web.config 中以解决此问题:

<defaultDocument>
  <files>
   <clear />
   <add value="default.aspx" />
  </files>
 </defaultDocument>

基于 reddit post。所以我这部分的总体 web.config 看起来是这样的:

<system.webServer>
    <rewrite>
      <rules>
        <rule name="RemoveDefaultAspxFromRoot" stopProcessing="true">
          <match url="default.aspx" ignoreCase="true" />
          <action type="Redirect" url="/" appendQueryString="true" />
        </rule>
      </rules>
    </rewrite>
    <defaultDocument enabled="true">
      <files>
        <clear />
        <add value="default.aspx" />
      </files>
    </defaultDocument>
  </system.webServer>

这在不添加其他文件的情况下效果很好。我不确定我是否理解为什么在 'default.aspx' 已通过 IIS 设置为默认文档时清除默认文档并添加 'default.aspx',但它解决了我的问题。谁能帮忙解释一下这是为什么,我很想学习