2011-12-15 11 views
8

Mamy witrynę ASP.Net MVC3 dostępną tylko przez HTTPS, za pomocą atrybutu RequireHTTPS na kontrolerze.Prawidłowa odpowiedź na żądanie HTTP HEAD na stronie tylko HTTPS

Otrzymujemy wiele żądań HTTP HEAD, głównie z botów na Twitterze. Domyślna odpowiedź ASP.Net/MVC3 to "Błąd wewnętrznego serwera wewnętrznego 500" i są przechwytywane/rejestrowane przez elmah i log4net (teraz odfiltrowane!).

Potrafię napisać konkretnego kontrolera i trasę do obsługi żądań innych niż HTTPS zgodnie z tym pytaniem - Responding to HEAD Request in asp.NET MVC 3.

Ale, z punktu widzenia boty, jaka byłaby najlepsza odpowiedź? 200, aby pokazać serwer jest żywy, przekierowanie 302 do URL-a HTTPS, czy pozostać przy 500, ponieważ strona nie jest dostępna przez HTTP?

+0

500 nie wydaje się w porządku ... nie jest istnieje tam kod statusu? 500 sugeruje, że gdzieś jest błąd. –

+1

Proponuję nie zgłaszać błędu 500. Jeśli witryna jest dostępna tylko za pośrednictwem protokołu HTTPS. Chciałbym użyć przekierowania 301 (stałe) zamiast 302 (tymczasowe). Można również użyć reguły przepisywania, aby przekierować cały ruch spoza https do https rozwiązującego problem. –

+0

Zgadzam się, że nie wyrzucamy błędu 500, ale jest to domyślne zachowanie MVC3: 'System.InvalidOperationException: Żądany zasób jest dostępny tylko przez SSL. na System.Web.Mvc.RequireHttpsAttribute.HandleNonHttpsRequest (AuthorizationContext filterContext) w System.Web.Mvc.RequireHttpsAttribute.OnAuthorization (AuthorizationContext filterContext) w System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters (ControllerContext controllerContext, filtry IList'1, ActionDescriptor actionDescriptor) – Chris

Odpowiedz

5

Mógłbyś odpowiedzieć

405 Method Not Allowed 

co oznacza

Metoda określona w żądaniu-Line nie jest dozwolone dla zasobu wskazanego przez URI żądania. Odpowiedź MUSI zawierać nagłówek Allow zawierający listę poprawnych metod dla żądanego zasobu.

lub

501 Not Implemented 

co oznacza

Serwer nie obsługuje funkcji wymaganych do spełnienia żądania. Jest to odpowiednia odpowiedź, gdy serwer nie rozpoznaje metody żądania i nie jest w stanie jej obsługiwać dla żadnego zasobu.

Osobiście chciałbym pójść z 405 ponieważ jest to błąd po stronie Klienta, „Hey man, nie służą te rzeczy tutaj.” wydaje się bardziej odpowiedni dla mnie niż "O czym ty do cholery mówisz? Nie rozumiem tego". jeden, drugi jest sugerowany przez , serwer nie rozpoznaje metody żądania bit opisu .

Wszystkie kody stanu http: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

1

W moim przypadku było tylko coraz żąda głową w katalogu głównym witryny / który wydaje się botów próbkowania. Więc trochę martwiłem się o zwrot 500 lub 404.

Więcej na 405

405 może być OK, jak na odpowiedź Albireo, ale trzeba zwrócić zaakceptowane czasowniki, coś takiego:

// 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 opcji

Szukam na komentarz w kodzie MVC, który nie przekierowuje żądania HEAD:

//only redirect for GET requests, otherwise the browser might not propagate the verb and request 
//body correctly. 

Wygląda na to, że inną opcją jest wysłanie 302. Powinno być rozsądnie bezpiecznie zwrócić 302 do strony HTTPS dla żądań HEAD do root (czyli co robi MVC dla GET). Więc wprowadziła następujące która opiera się na sposobie, w jaki robi to 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; 
} 

wdrożyć w Global.asax.cs:

protected void Application_Error(object sender, EventArgs e) 
{ 
    //Your code here 
} 
Powiązane problemy