Правильный ответ на запрос HTTP HEAD на сайте только HTTPS - PullRequest
8 голосов
/ 15 декабря 2011

У нас есть сайт 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 ]

4 голосов
/ 16 декабря 2011

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

405 Method Not Allowed

, что означает

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

или с

501 Not Implemented

, что означает

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

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

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

1 голос
/ 18 февраля 2014

В моем случае я получал только 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
}
...