在HTTPS专用站点上对HTTP HEAD请求的正确响应

问题描述:

我们通过使用控制器上的RequireHTTPS属性,可以通过HTTPS访问ASP.Net MVC3站点。在HTTPS专用站点上对HTTP HEAD请求的正确响应

我们正在接收大量的HTTP HEAD方法请求,主要来自似乎是Twitter机器人的东西。默认的ASP.Net/MVC3响应是'500内部服务器错误',并且正在被elmah和log4net(现在被滤除!)捕获/记录。

我可以编写一个特定的控制器和路由来处理这些非HTTPS请求,根据这个问题 - Responding to HEAD Request in asp.NET MVC 3

但是,从机器人的角度来看,最好的回应是什么? 200以显示服务器是否有效,302重定向到HTTPS url,或者坚持使用500,因为该站点无法通过HTTP访问?

+0

500看起来不正确...是不是有这样的状态代码? 500表明实际上有一处错误。 – 2011-12-15 17:18:30

您可以用

405 Method Not Allowed 

响应,这意味着

在Request-Line中指定的方法是不允许由请求URI标识的资源。响应必须包含一个Allow头,其中包含请求资源的有效方法列表。

501 Not Implemented 

这意味着

服务器不支持执行该请求所需的功能。这是服务器无法识别请求方法并且无法支持任何资源的适当响应。

就个人而言,我会与405去,因为它是在客户端上的错误,一个“嘿,伙计,我们不提供这些东西在这里。” “似乎比我更适合”你到底在说什么?我不明白。“一,后者是由建议服务器不能识别请求方法位的501说明。

所有HTTP状态代码:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html上这似乎是机器人探测现场/

在我而言,我只是得到HEAD请求。所以,我有点担心回到500或404。

更多关于405

405可按照的Albireo的回答OK,但你需要返回接受动词,是这样的:

// 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选项

展望在未重定向HEAD请求的MVC代码中注释:

//only redirect for GET requests, otherwise the browser might not propagate the verb and request 
//body correctly. 

看起来另一种选择是发送一个302.将一个302返回到HTTPS站点,以便将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 
}