ASP.NET MVC生产环境Elmah报路径/控制器异常求助
解决生产环境Elmah捕获的随机路径/操作方法NotFound异常
兄弟,这俩错误我太熟了——一看那些带随机数字的non-existent-xxxxxx后缀,就知道是爬虫或者恶意扫描工具在瞎折腾你的站点,根本不是你代码的问题!这类工具会自动生成各种奇怪的路径/方法名,尝试探测站点漏洞,结果触发了ASP.NET的路由匹配逻辑,最终抛出这些HttpException。
给你几个实用的解决思路:
1. 让路由直接忽略这类请求
在你的RouteConfig.cs(或者Startup.cs里的路由配置)中添加忽略规则,匹配带non-existent-+随机数字的路径,让ASP.NET直接跳过控制器匹配:
// RouteConfig.cs示例 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // 添加这条规则,忽略带non-existent-数字后缀的请求 routes.IgnoreRoute("{*invalidpath}", new { invalidpath = @".*non-existent-\d+" }); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }
这样这类请求会直接返回404,不会触发控制器查找的异常。
2. 配置自定义404错误页
生产环境一定要配置自定义404页面,既提升用户体验,也能让这类无效请求的处理更规范,避免不必要的异常日志。在web.config里添加:
<system.web> <customErrors mode="On" defaultRedirect="~/Error/General"> <error statusCode="404" redirect="~/Error/NotFound"/> </customErrors> </system.web>
记得在你的ErrorController里实现NotFound操作方法,返回对应的视图。
3. 让Elmah过滤这类日志
如果不想完全拦截请求,只是不想让Elmah记录这些无效的404错误,可以在web.config的Elmah配置节点中添加过滤规则:
<elmah> <!-- 其他Elmah配置 --> <errorFilter> <test> <and> <equal binding="HttpStatusCode" value="404" type="Int32" /> <regex binding="Context.Request.Path" pattern="non-existent-\d+" /> </and> </test> </errorFilter> </elmah>
这样Elmah会自动跳过符合条件的错误日志,减少日志噪音。
4. 从源头拦截恶意请求
检查服务器的访问日志,找到这些请求的来源IP,如果是固定的恶意爬虫,可以通过服务器防火墙或者IIS的IP限制规则,直接拦截这些IP的请求,从根源减少这类无效请求。
内容的提问来源于stack exchange,提问作者Tanveer Fatima
相关产品推荐
相关产品推荐

