我们只能通过HTTPS访问ASP.Net MVC3站点,方法是使用控制器上的RequireHTTPS属性。
我们收到了大量HTTP HEAD方法请求,主要来自看似Twitter的机器人。默认的ASP.Net/MVC3响应是'500内部服务器错误',正在被elmah和log4net捕获/记录(现已过滤掉!)。
我可以编写一个特定的控制器和路由来处理这些非HTTPS请求 - Responding to HEAD Request in asp.NET MVC 3。
但是,从机器人的角度来看,最好的回应是什么? 200显示服务器是活动的,302重定向到HTTPS网址,还是坚持500,因为网站无法通过HTTP访问?
答案 0 :(得分:4)
您可以回复
405 Method Not Allowed
表示
请求行中指定的方法不允许由Request-URI标识的资源。响应必须包含一个Allow头,其中包含所请求资源的有效方法列表。
或
501 Not Implemented
表示
服务器不支持完成请求所需的功能。当服务器无法识别请求方法且无法为任何资源支持时,这是适当的响应。
就个人而言,我会选择405
,因为它在客户端是错误的,“嘿,我们不会在这里提供这些东西。”似乎更合适我比“你到底在说什么?我不明白。”一,后者是由建议服务器无法识别请求方法位501
描述。
所有HTTP状态代码:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
答案 1 :(得分:1)
就我而言,我只是在网站/
的根目录上收到HEAD请求,这似乎是机器人探测。所以,我有点担心返回500或404.
更多关于405
根据Albireo的回答,405可能没问题,但你需要返回被接受的动词,例如:
// 405 must include allowable methods.
// https://tools.ietf.org/html/rfc2616#section-14.7
httpContext.Response.StatusCode = (int)HttpStatusCode.MethodNotAllowed;
httpContext.Response.AddHeader( "Allow", "GET" );
302选项
查看MVC代码中没有重定向HEAD请求的注释:
//only redirect for GET requests, otherwise the browser might not propagate the verb and request
//body correctly.
似乎另一个选择是发送一个302.将一个302返回到HTTPS站点以获取root的bot HEAD请求应该是相当安全的(这是MVC为GET做的)。所以,我实现了以下基于MVC的方式:
if( isHead == true && isRoot == true )
{
httpContext.ClearError();
httpContext.Response.Clear();
httpContext.Response.StatusCode = 302;
string url = "https://" + httpContext.Request.Url.Host + httpContext.Request.RawUrl;
httpContext.Response.Redirect(url, endResponse: false);
return;
}
在global.asax.cs中实施:
protected void Application_Error( object sender, EventArgs e )
{
//Your code here
}