【问题标题】:URL Rewrite causing redirect loopURL重写导致重定向循环
【发布时间】:2026-01-17 07:45:02
【问题描述】:

今天在一个旧的 .Net Webforms 网站中设置 URL 重写时,一个问题一直让我感到沮丧(编辑:这是一个网站项目,而不是一个 Web 应用程序项目,如果这有所作为的话)。我正在处理的网站链接到很多,都链接到“webroot.com/default.aspx”,而不仅仅是“webroot.com”。我们想要设置(在某个地方,此时我不在乎它是作为重定向还是 web.config 在 global.asax 中)一个 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>

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

我尝试在规则中添加以下内容作为伏都教博客帖子的想法:

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

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

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

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

我仍然遇到重定向问题。

谁能看到我遗漏的任何东西,或者有其他建议?奇怪的是,其他人似乎可以通过使用 Rewrite 操作解决此问题,但它对我不起作用。

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

【问题讨论】:

    标签: .net iis iis-7 web-config iis-8


    【解决方案1】:

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

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

    “评估按父子顺序执行,这意味着首先评估父规则,最后评估在最后一个子级别上定义的规则。” - http://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference

    尝试另一种重定向规则:

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

    有关控制默认值的更多信息,另请参阅此链接:https://technet.microsoft.com/en-us/library/cc753615(v=ws.10).aspx

    【讨论】:

    • 这对您有何帮助?我注意到赞成票消失了。
    • 我不允许投票;我没有名气。我在这里发了一个 reddit 帖子:reddit.com/r/dotnet/comments/38f12c/… ... 有人提到了与您相同的推理(默认文档是 default.aspx,以循环结尾),他们的回答是清除默认文档并在 web.config 中将其重置为 default.aspx。这不需要另一个网页就可以工作,所以我选择它作为答案。你的也有效。我很想知道当 default.aspx 已经在 IIS 中设置为默认文档时这是如何工作的。
    【解决方案2】:

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

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

    基于 reddit 帖子。所以我这个部分的整体 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>
    

    在不添加其他文件的情况下效果很好。我不一定确定我理解为什么在通过 IIS 将“default.aspx”设置为默认文档时清除默认文档和添加“default.aspx”有效,但它解决了我的问题。如果有人可以帮助解释为什么会这样,我很乐意学习。

    【讨论】: