0

我有一个 ASP.NET 页面来处理“404 页面未找到”,它是通过在我的 web.config 文件中配置<customErrors>部分并在 IIS 管理器中设置 404 错误的自定义错误页面来设置的。

它对我网站根目录中的页面按预期工作,但在站点的子目录中不起作用 - 我的自定义错误页面中的超链接和内容具有错误的 url 基础。

我的错误页面中的所有链接都是服务器端控件(runat="server"),并且它们的链接基于“~/”。

当我浏览http://mysite/nosuchfolder/nosuchfile带有链接的页面时,页面呈现的链接认为它是从根目录提供的,而不是从根目录提供服务,nosuchfolder因此所有链接在浏览器中都被破坏,因为浏览器基于nosuchfolder.

有什么方法可以“告诉” ASP.NET 页面以不同的文件夹/文件名重新建立链接?

笔记:

  • 大部分页面模板是从母版页呈现的
  • 我正在运行 IIS6 并将自定义错误 404 设置为 URL:/error404.aspx
  • 在我的 web.config 文件中,我已将<customErrors>部分配置为重定向到/error404.aspx
  • 作为一种解决方法,我<base>在页面中使用 HTML 标记,但我想避免这种情况
  • 我不想将所有基于“~/”的链接更改为“/”或内联基础黑客
4

2 回答 2

0

当您设置 uo yoru 客户错误页面时,是使用重定向还是 URL 重写?您描述的问题是在 ASP.NET 中实现 URL 重写时的常见问题。本质上,在 URL 重写中,处理器在解析 URL 时使用哪个 URL 变得不清楚。如果文章/帖子已经写了关于如何解决这个问题的数字。

http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx

http://searchengineland.com/url-rewriting-custom-error-pages-in-aspnet-20-12234

于 2009-06-08T14:29:13.160 回答
0

Scott Gu 关于 URL 重写的文章让我走上了正确的道路(可以这么说!) - 感谢 James 的提示。

答案是使用Context.RewritePath(newPath)

这是我在自定义 404 页面中使用的代码 -

protected override void Render(HtmlTextWriter writer)
{
    string rebase = Server.UrlDecode(Request.ServerVariables["QUERY_STRING"]);

    if (rebase.Length>10 && rebase.StartsWith("404;"))
    {
        try
        {
            rebase = new Uri(rebase.Substring(4)).AbsolutePath;
        }
        catch
        {
            rebase = "/";
        }
        finally
        {
            Context.RewritePath(rebase);
        }
    }

    base.Render(writer);
    Response.StatusCode = 404;
}

要以相同的方式处理丢失的 .aspx 页面,在web.config调用redirectMode中有一个设置,您将其设置为ResponseRewrite

<customErrors mode="On" redirectMode="ResponseRewrite">
    <error statusCode="404" redirect="~/error404.aspx" />
</customErrors>

这将停止将用户重定向到的默认行为~/error404.aspx?aspxerrorpath=badfile

注意:此设置是最新的 ASP.NET 服务包(例如 Framework 3.5 SP1)的新设置

重定向模式的 MSDN 参考

于 2009-06-09T08:11:56.300 回答