10

通过使用控制器上的 RequireHTTPS 属性,我们有一个只能通过 HTTPS 访问的 ASP.Net MVC3 站点。

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

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

但是,从机器人的角度来看,最好的反应是什么?200 表示服务器处于活动状态,302 重定向到 HTTPS 网址,还是坚持使用 500,因为该站点无法通过 HTTP 访问?

4

2 回答 2

4

你可以回应

405 Method Not Allowed

意思是

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

或与

501 Not Implemented

意思是

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

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

所有 HTTP 状态码:http ://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

于 2011-12-16T10:18:01.660 回答
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选项

查看未重定向 HEAD 请求的 MVC 代码中的注释:

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

似乎另一种选择是发送 302。将 302 返回到 HTTPS 站点以将机器人 HEAD 请求返回到 root 应该是相当安全的(这就是 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
}
于 2014-02-18T02:31:21.783 回答