【问题标题】:Correct response to HTTP HEAD Request on HTTPS only site正确响应仅 HTTPS 站点上的 HTTP HEAD 请求
【发布时间】:2011-12-15 17:15:34
【问题描述】:

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

【问题讨论】:

  • 500 似乎不对...没有状态码吗? 500 表明某处实际上存在错误。
  • 我建议不要抛出 500 错误。如果该站点只能通过 HTTPS 访问。我会使用 301 重定向(永久)而不是 302(临时)。您还可以使用重写规则将所有非 https 流量重定向到 https 解决问题。
  • 同意不抛出 500 错误,但这是 MVC3 的默认行为:System.InvalidOperationException: The requested resource can only be accessed via SSL. at System.Web.Mvc.RequireHttpsAttribute.HandleNonHttpsRequest(AuthorizationContext filterContext) at System.Web.Mvc.RequireHttpsAttribute.OnAuthorization(AuthorizationContext filterContext) at System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList1 过滤器,ActionDescriptor actionDescriptor)

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


【解决方案1】:

你可以回复

405 Method Not Allowed

意思是

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

或与

501 Not Implemented

意思是

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

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

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

【讨论】:

  • 405 Method not allowed 不是正确的响应。使用 http 而不是 https 不是使用不允许的方法。 http(s) 是 URI 中的 scheme。方法是发送请求的类型,可以是GETHEADPOSTPUTDELETECONNECTCONNECTOPTIONSTRACEPATCH中的任何一个(请参阅developer.mozilla.org/en-US/docs/Web/HTTP/Methods)。抛出 405 将告诉客户端发生了错误。
【解决方案2】:

在我的例子中,我只在站点 / 的根目录上收到 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 发送机器人 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    相关资源
    最近更新 更多