Правильный ответ на HTTP-запрос HEAD на HTTPS-сайте

У нас есть сайт ASP.Net MVC3, доступный только по HTTPS, с помощью атрибута RequireHTTPS на контроллере.

Мы получаем множество запросов метода HTTP HEAD, в основном от роботов Twitter. Ответ ASP.Net/MVC3 по умолчанию - это «500 Internal Server Error», и он перехватывается / регистрируется elmah и log4net (теперь отфильтрован!).

Я мог бы написать конкретный контроллер и маршрут для обработки этих запросов, отличных от HTTPS, в соответствии с этим вопросом - Ответ на запрос HEAD в asp.NET MVC 3.

Но с точки зрения ботов, какой ответ был бы лучшим? 200, чтобы показать, что сервер активен, перенаправление 302 на URL-адрес HTTPS или придерживаться 500, поскольку сайт недоступен по HTTP?


person Chris    schedule 15.12.2011    source источник
comment
500 не кажется правильным ... разве для этого нет кода статуса? 500 предполагает, что где-то действительно есть ошибка.   -  person Andrew Barber    schedule 15.12.2011
comment
Я предлагаю не выдавать ошибку 500. Если сайт доступен только по HTTPS. Я бы использовал перенаправление 301 (постоянное) вместо 302 (временное). Вы также можете использовать правило перезаписи, чтобы перенаправить весь трафик, отличный от https, на https, решив проблему.   -  person Nick Bork    schedule 15.12.2011
comment
Согласитесь, что ошибка 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)   -  person Chris    schedule 16.12.2011


Ответы (2)


Вы могли бы ответить

405 Method Not Allowed

что значит

Метод, указанный в строке запроса, не разрешен для ресурса, указанного в Request-URI. Ответ ДОЛЖЕН включать заголовок Allow, содержащий список допустимых методов для запрошенного ресурса.

или с

501 Not Implemented

что значит

Сервер не поддерживает функции, необходимые для выполнения запроса. Это подходящий ответ, когда сервер не распознает метод запроса и не может поддерживать его для какого-либо ресурса.

Лично я бы выбрал 405, так как это ошибка на стороне клиента, «Эй, чувак, мы здесь не обслуживаем». кажется мне более подходящим, чем «Что? ты что, черт возьми? Я этого не понимаю. " один, последний предполагает бит сервер не распознает метод запроса в 501 описании.

Все коды состояния HTTP: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

person Albireo    schedule 16.12.2011
comment
405 Method not allowed - неправильный ответ. Использование http вместо https не означает использование запрещенного метода. http (s) - это scheme в URI. Метод представляет собой тип отправляемого запроса и может быть любым из GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE или PATCH (см. developer.mozilla.org/en-US/docs/Web/HTTP/Methods). Сообщение 405 сообщит клиенту, что произошла неправильная ошибка. - person Fat Monk; 28.11.2018

В моем случае я получал запросы HEAD только в корне сайта /, что похоже на зондирование ботов. Итак, я немного беспокоился о том, чтобы вернуть 500 или 404.

Подробнее о 405

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 для запросов 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
}
person acarlon    schedule 18.02.2014