Правильный ответ на запрос 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?

2 ответа

Вы можете ответить

405 Method Not Allowed

что значит

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

или с

501 Not Implemented

что значит

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

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

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

В моем случае я получал только 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 к корню (что 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
}
Другие вопросы по тегам