新西兰程序员 ASP.NET网站中设置404自定义错误页面

news/2024/5/21 6:03:01/文章来源:https://blog.csdn.net/weixin_34279061/article/details/86128863

ASP.NET网站中设置404自定义错误页面

在用ASP.NET WebForm开发一个网站时,需要自定义404错误页面. 做法是这样的

在网站根目录下建立了一个404.html的错误页面,然后在Global.asax文件中,加入如下代码:

复制代码
<%@ Application Language="C#" %><script runat="server">void Application_Error(object sender, EventArgs e){Response.StatusCode = 404;Server.Transfer("/404.html");Server.ClearError();}
</script>
复制代码

然后运行网站,比如随便输入一个111.aspx时,发现在chrome上会自动redirect到这个404.html, 但是在IE上时,却不会。

在网上查找原因,找到如下答案:

 果然,在这个页面中加入一些内容后,这个问题就解决了

 

另外,这种设置404错误页面,还有一个问题就是,当你在网址中输入不存在的比如111.aspx时,它会自动转入自定义的404.html

但是当你在网址中输入不存在的111, 没有后缀名aspx时,它就不会显示自定义的404.html了

为什么会出现这种情况呢 ? 应该怎么解决呢 ?

 

解决方法:  你需要在web.config中进行配置,在 <system.webServer>配置节点中加入如下语句

 <httpErrors errorMode="Custom" existingResponse="Replace"><clear /><error statusCode="404" path="404.html" /></httpErrors>

 

详细的处理ASP.NET网站自定义错误页面方法,可以参考如下这篇文章,写的很好

转载自 http://edi.wang/post/2014/1/11/iis7-aspnet-custom-error-best-practice

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

针对IIS7以上的ASP.NET网站自定义错误页面与异常日志总结

自定义错误页面和异常记录是个很古老的话题了,但依旧可以让人爆到现在。在我做了无数次试验并总结经验和原则后,写下本文,已警后人。

本文的范围和限制

  1. 本文仅仅适用于部署在IIS7或以上版本中的ASP.NET 4.0集成模式应用程序。IIS7以上的意思是Windows Server 2008以上服务器适用。我已在WS2012R2,IIS8上测过。
  2. 本文的方法均适用于ASP.NET WebForm和MVC应用程序。

本文针对的问题

  1. 静态错误页面好还是动态错误页面好?我该如何设计ASP.NET网站错误处理?
  2. 我不希望错误页面后面跟上aspxerrorpath=…这个小尾巴。
  3. 我的自定义错误页面在VS里调试是好的,为什么部署到服务器上就出不来了?
  4. 我的自定义错误页面可以正常显示,但为什么返回的Http状态码不正确?
  5. 异常日志该怎样记录,有没有比较好的实践?

一、错误页面的选择

选择静态html页面作为错误页,还是使用.aspx或是MVC View来显示错误页面好?这个问题许多人的偏好都不一样。我强烈建议大家用html静态页面作为错误页。请看分析:

首先,用动态页面的人,无非是为了解决三个问题:显示错误摘要、记录日志、返回正确的状态码。但是,动态页面最大的问题在于,它们本身是要经过ASP.NET和后台代码处理的,万一你的后台代码是爆的,或者ASP.NET自己爆了,那你的错误页面一旦被请求,本身就会引发另一个错误。而静态html是不会有这个问题的。至于在MVC里专门建一个ErrorController的做法就更不可取了。MVC是基于ASP.NET之上的,MVC的Controller只能抓MVC自己的错误,抓不到ASP.NET的错误,意思就是说,当你的错误并不在MVC层面上的时候,ErrorController没有任何用武之地。例如,当你部署的MVC应用程序缺少MVC的dll时候,MVC框架本身都跑不起来,这个错误如何去抓?

另外,我认为在一个Internet站点上,绝不应该向访客显示任何的错误摘要。这是非常不安全的。所以完全没有必要用动态页面。

至于返回正确状态码的问题是这样的:不少小伙伴发现自己的错误页面能够显示,但返回的状态码是200OK,所以无奈之下用动态页面,写上Response.StatusCode = 500这样的代码来强撸。这个在稍后的文章里有解决方案,所以不要为了状态码而冒险用动态页面。有的小伙伴会问,我只写一笔Response.StatusCode=500能有什么风险?呵呵,想想这种情况:404.cshtml,razor引擎的dll不见了……

另外,一个原则是:错误页面应当是独立的。如果你的静态页面要用到图片和CSS等外部资源,建议嵌入在页面里边,做成单文件的,以免显示错误页面时请求相关资源再次引发异常。小伙伴又要问了,请求个CSS和图片什么的,肿么会引发异常呢?那你看看这个:resources.axd?image=…,呵呵。

那么用了静态页面以后,记录日志怎么办呢?正确的方法应该是交给Global.asax中的“Application_Error”事件处理。稍后会有翔解。

二、配置错误页面:customErrors VS httpErrors

首先,错误页面的显示方式有两种。如果你打开IIS,会看到两个配错误页的地方:.NET Error Pages和Error Pages。

 

站在开发者的角度来说,ASP.NET Section下的“.NET Error Pages”就是web.confg/system.web/customErrors节点。而IIS Section下的”Error Pages”是web.config/system.webServer/httpErrors节点,这个是IIS7以上特有的。

任何在IIS上对这两处的更改其实都是在修改web.config文件。

那么我们该用哪一个来配置自定义错误页呢?我的一个原则是:让IIS向用户展示错误页面,而不要依赖于ASP.NET。 猿因如下:

CustomError的问题:

a)  在默认情况下,CustomError会采用302重定向的方式来展示错误页面,如果客户端请求了一个404的页面,那它得到的将会是一个302紧接着一个200OK,对于人类来说这是OK的,毕竟用户看到了友好的错误页面,但搜索引擎会认为这个不存在的地址是正常的页面,并把你的404页面收入搜索结果。并且每次引发错误,URL后边都会跟上aspxerrorpath这个小尾巴,比如:

http://yoursite.com/404.html?aspxerrorpath=/somethingnotexsit

b) 在配置了redirectMode=“ResponseRewrite”后,会引发一个问题,09年就有人当bug提交到MS Connect上了,但目前微软不打算fix这个bug。即该模式在VS自带的ASP.NET Development Server上是有效的,浏览器显示的是解析后的HTML页面,而部署到IIS上之后,浏览器显示是raw html,即你的错误页面的HTML代码。并且该行为不具有确定性,天晓得你的网站换个环境部署又会爆成什么样。

c)  IIS7以上版本的特殊性:在集成模式下,IIS的错误页面会优先于ASP.NET错误页面,即IIS的默认错误页会覆盖你配置的CustomErrors页面,这就是为什么你在VS下调试是好的,部署到服务器上就爆了。

在IIS7之后,取决于你的配置,用户的请求并不都一定在ASP.NET管线上处理。如果引发异常的地方不在ASP.NET,那就不会显示CustomErrors的错误页面。

所以,我强烈建议大家用httpErrors节点替代CustomErrors来配置错误页面。

三、File还是ExecuteURL:httpErrors的正确配法

先贴一个正确的配置样例:是用File配的。

注意两处地方:

  1. 斜杠是Windows文件路径的反斜杠“\”而不是网址URL的斜杠“/”
  2. Path不要以“~”或“\”开头

不要问我为什么,我也不知道,反正这么弄就是好的。

如果你不幸用了ExecuteURL,你会发现URL路径只能以“/”开头:

并且你的错误页会返回200OK而不是正确的404、500等错误码。这在我以前的文章里写过:

http://diaosbook.com/Post/2012/6/24/correct-way-to-implement-custom-error-page-return-statecode-instead-of-http-200

而用File的意思是,当错误被爆出来之后,IIS会把目标File,比如404.html的内容,塞到当前的Response流里面,保持Http状态码依旧是404。这就是我们想要的。

四、异常日志记录

文章在一开始就提了个问题,木有了动态页面,怎么记录错误日志?我的做法是在Global.asax里处理。

Application_Error事件样例代码如下:

复制代码
var exception = HttpContext.Current.Server.GetLastError();if (null != exception)
{// by default 500var statusCode = (int)HttpStatusCode.InternalServerError;if (exception is HttpException){statusCode = new HttpException(null, exception).GetHttpCode();}else if (exception is UnauthorizedAccessException){// to prevent login prompt in IIS// which will appear when returning 401.statusCode = (int)HttpStatusCode.Forbidden;}if ((LogHttpNotFound && statusCode == 404) || statusCode != 404){if (null != _loggerFunc){LoggerFunc(string.Format("ASP.NET Error Captured, Request URL: {0}, Exception:",HttpContext.Current.Request.Url), exception);}}ExceptionInfo = exception.Message;_statusCode = statusCode;}
复制代码

一个小小的建议是不要记录404错误,因为你的网站在Internet上会被各种搜索引擎、扫描工具和黑客菊爆,有一种攻击手段是通过字典猜解目录,返回404就是不存在,返回403就是存在。所以,当你碰到这种无聊黑客的时候,如果记录了404请求,那你的日志会非常的大……

我记日志用的组件是NLog,配置简单,使用容易。Log4net这货已经好久没更新了。

如果你决定自己设计日志模块,那要记住两个原则:

日志模块本身并不能因为自己爆掉而影响整个系统运行,即任何在日志模块里的异常不应该向外冒泡。

考虑并发写日志的情况,日志操作应该是Fire and Forget的,不能让应用程序等待日志写入。

五、总结

  1. 采用静态html页面作为错误页。
  2. 采用httpErrors配置错误页面,目的是兼容IIS7以上环境、返回正确错误码、去掉aspxerrorpath小尾巴。
  3. 日志记录写在Global.asax里,在Application_Error事件中记录

 

原文:http://www.cnblogs.com/wphl-27/p/6014654.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_777066.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站设计——细节决定成败(前端开发也需要发现一些设计美感)

之前看过一个响应式的网站感觉整体设计很大方、灵动&#xff0c;给人感觉很舒服&#xff0c;无论从配色、排版、交互等方面这个网站设计的都很有想法&#xff0c;现在分享给大家看看&#xff0c;大家自己研究去吧。 电商网站的参考很多&#xff0c;花瓣里面一搜一大把&#xf…

Confluence 5 如何将网站加入到白名单中

如果希望 Confluence 能够读取其他网站的内容&#xff0c;那么首先需要将其他网站加到 Confluence 的白名单中。 登录 Confluence 的管理员界面后按照下面的路径访问&#xff1a;【USERS & SECURITY】 》 【Whitelist】 输入你希望加入白名单的网站。 然后单击添加。 WIKI.…

Web Tours自带示例网站无法打开的解决方案

问题现象&#xff1a; LoadRunner自带的测试样品&#xff0c;旅行社机票预订系统HP Web Tours以下简称为Web Tours。 1、LoadRunner程序的Sample目录下无Web和Web Tours服务启动项&#xff0c;怎么办&#xff1f; 2、LoadRunner自带的Web测试样品Web Tours打不开或报错&#xf…

HTML 5+CSS 3网站布局应用教程 (赵振方) 随书光盘 ​

《HTML5CSS3网站布局应用教程》全面介绍HTML 5与CSS 3进行Web设计的知识。全书由16章组成。主要内容包括&#xff1a;主流浏览器对HTML 5的支持情况、HTML 5与HTML4在语法上的区别、结构元素、表单与文件、图形绘制、多媒体播放。同时还详细介绍CSS 3的相关知识&#xff0c;包括…

将本机电脑作为自己的网站服务器--基于XAMPP在本地建立wordPress网站

“我不敢说自己从未担心害怕过。 实际上我希望少一点担心害怕&#xff0c;因为它让我分心&#xff0c;让我的神经系统备受煎熬”。----马斯克周日&#xff0c;搞了大半天&#xff0c;为了熟悉wordPress&#xff0c;先在自己的电脑上利用wordPress建立了一个网站&#xff0c;哈&…

JFrame中setDefaultCloseOperation的参数含义

实例1&#xff1a;一个空的java窗口 // JFrameDemo1.java import javax.swing.*; //使用Swing类&#xff0c;必须引入Swing包 public class JFrameDemo1{ public staticvoid main( String args[]) { //定义一个窗体对象f&#xff0c;窗体名称为"一个简单窗口" …

个人动态网站,大型个人主题网站

*** 个人主题网站动态*** 自己做的一个有关自己类似于博客网站的web页面&#xff0c;里面很多按钮都是可以与鼠标互动发光&#xff0c;但是图片展现不了。 这个网站敲了我48天&#xff0c;用心良苦&#xff01;早就想做一个个人的主题网站了&#xff0c;希望网友们多多支持&am…

大型个人网站开发

这里介绍一个自己创建的网站&#xff0c;目前还在持续更新&#xff0c;1月27号上线话不多说先上图&#xff1a; &#xff08;网站名称&#xff1a;http://ftzlovedsj.com,自己在阿里云上买的域名&#xff0c;一年也就70块钱左右&#xff09; 这个是开始界面&#xff0c;按钮是动…

超级漂亮炫酷的HTML菜单栏导航栏+网站+独特二级列表

下面介绍一个十分特效炫酷的菜单栏 还是老样子直接上图&#xff1a;&#xff08;下面有彩蛋&#xff09; 这里的首页圆圈点击会有渐变色和旋转的特效&#xff01;&#xff01; 右上角的导航栏也是十分炫酷的动态特效&#xff0c;点击变色&#xff01; 具体网站代码请观看这里…

使用Apache搭建Web网站服务器

使用Apache搭建Web网站服务器一&#xff1a;实验目标apache服务器常见概念apache服务器安装及相关配置文件例1&#xff1a;为公司内网搭建一个web服务器例2&#xff1a;使用rpm搭建lamp 环境例3&#xff1a;修改网根目录及对应参数&#xff0c;设置访问权限例4,&#xff1a;使用…

《流量的秘密 Google Analytics网站分析与商业实战》一1.4 Google Analytics 与众不同的原因...

本节书摘来自异步社区《流量的秘密 Google Analytics网站分析与商业实战》一书中的第1章&#xff0c;第1.4节&#xff0c;作者 【英】Brian Clifton&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 1.4 Google Analytics 与众不同的原因 关于Google Analytic…

SharePoint:如何在SharePoint 2013限制多个网站集的Search Result

今天在MSDN解答问题时发现&#xff0c;很多企业终端用户对Search的要求是比较严格的&#xff0c;SharePoint虽然是企业数据管理和团队协作的最佳平台&#xff0c;但在庞大的数据平台中&#xff0c;即便有提供Search Service也不会精准的检索到用户所需要的文档&#xff0c;会根…

4个功能强大的资源网站,轻松帮你将资源一网打尽!赶快收藏

1.Doyoudo 一个高质量教程搜索网站&#xff0c;它提供的教程包括&#xff1a;平面设计&#xff0c;后期剪辑&#xff0c;特效合成&#xff0c;三维动画&#xff0c;音乐音效以及pr&#xff0c;ps视频教程等。 2.疯狂影视搜索 一个全能的影视搜索引擎&#xff0c;界面非常简洁&a…

网站为什么JavaScript调用尽量放到网页底部?

随时科技的进步&#xff0c;现在人们对物质的追求越来越高&#xff0c;想当初还是modem拨号上网时&#xff0c;我们会等上1到2分钟打开一个网站而高兴很久&#xff0c;而现在网速越来越快&#xff0c;同时访问的用户也越来越多&#xff0c;人们对速度的追求也越来越高&#xff…

使用EF Code First搭建一个简易ASP.NET MVC网站,允许数据库迁移

本篇使用EF Code First搭建一个简易ASP.NET MVC 4网站&#xff0c;并允许数据库迁移。 创建一个ASP.NET MVC 4 网站。 在Models文件夹内创建Person类。 public class Person{public int ID { get; set; }public string FirstName { get; set; }public string LastName { get; s…

2018年最好的医疗网站设计及配色赏析

如何设计出优秀的医疗网站呢&#xff1f;不妨看看一些优秀的案例。 1、 The Doctors Laser Clinic -医疗美容类网站设计 设计特色&#xff1a;迎合女性审美、卡片式设计、优雅紫色调为主 作为医疗美容类网站&#xff0c;大部分以女性顾客为主。所以懂得迎合女性审美&#xff…

Chrome发大招! HTTP网站全部拉入黑名单

7 月 24 号 Chrome 68发布会中&#xff0c;Google 引入了一项重大的变化。 自发布当日&#xff08;7月24日&#xff09;起&#xff0c;所有未加密的网站都会在地址栏上明确标记为“Not Secure”&#xff08;不安全&#xff09;。也就是说&#xff0c;如果你的网站没有采用HTTP…

吉林织梦网络公司网站风格模板 - www.thinkphp.biz

吉林织梦网络公司网站风格模板&#xff0c;完整无错&#xff0c;演示地址&#xff1a;http://www.thinkphp.biz 购买地址&#xff1a;http://www.bbscms.net/html/cmsmb/dedecms/20110509/552.html转载于:https://www.cnblogs.com/doophp/archive/2011/05/10/2042444.html

揭秘新手网站优化的六大SEO技术

开发十年&#xff0c;就只剩下这套Java开发体系了 >>> 第一点&#xff1a;关键词的整体方向要研究到位&#xff0c;比如西安seo关键词的搜索趋势会随着时间的变化而有波动的&#xff0c;像电子行业的录音机&#xff0c;随身听等都早已成为昨日黄花了&#xff0c;人…

5款免费的优秀网站配色方案工具

网站的配色方案决定了访问者对网站的第一印象&#xff0c;有很多工具可以帮助选择合适的配色方案&#xff0c;本文为网站设计者介绍五款免费的优秀网站配色方案工具。1. KulerKuler是一款倍受专业网页设计人员喜爱的工具&#xff0c;它在配色方案中增加了社会化媒体和网络因素&…