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

时间:2011-12-15 17:15:34

标签: asp.net-mvc-3 http https http-head

我们只能通过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访问?

2 个答案:

答案 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
}