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