我有一个ASP.NET页面来处理“找不到404页面”它的设置是通过在我的web.config文件中配置<customErrors>
部分并在IIS管理器中设置404错误的自定义错误页面。
它对我网站根目录中的网页有效,但在网站的子目录中不起作用 - 我的自定义错误页面中的超链接和内容的网址基础错误。
我的错误页面中的所有链接都是服务器端控件(runat =“server”),其链接基于“〜/”。
当我使用http://mysite/nosuchfolder/nosuchfile
浏览网站时,页面呈现的链接认为它是从根目录提供的,而不是来自nosuchfolder
,因此浏览器基于浏览器时,所有链接都会被破坏来自nosuchfolder
的链接。
有没有办法'告诉'ASP.NET页面重新建立不同文件夹/文件名的链接?
注意:
/error404.aspx
<customErrors>
部分配置为重定向到/error404.aspx
<base>
标记,但我想避免这种情况答案 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)
的新设置