如何修改ASP.NET页面中的超链接和内容?

时间:2009-06-08 14:19:39

标签: asp.net http-status-code-404 rebase base rebasing

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

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

我的错误页面中的所有链接都是服务器端控件(runat =“server”),其链接基于“〜/”。

当我使用http://mysite/nosuchfolder/nosuchfile浏览网站时,页面呈现的链接认为它是从根目录提供的,而不是来自nosuchfolder,因此浏览器基于浏览器时,所有链接都会被破坏来自nosuchfolder的链接。

有没有办法'告诉'ASP.NET页面重新建立不同文件夹/文件名的链接?

注意:

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

2 个答案:

答案 0 :(得分:0)

当您设置uo yoru custome错误页面时,它是使用重定向还是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

答案 1 :(得分:0)

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

答案是使用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 Service Pack(例如Framework 3.5 SP1)

的新设置

MSDN Reference for redirectMode