2011-12-15 18 views
8

Tenemos un sitio ASP.Net MVC3 al que solo se puede acceder a través de HTTPS, utilizando el atributo RequireHTTPS en el controlador.Respuesta correcta a HTTP HEAD Solicitud en el sitio HTTPS solo

Estamos recibiendo numerosas solicitudes de HTTP HEAD, principalmente de lo que parecen ser bots de Twitter. La respuesta predeterminada de ASP.Net/MVC3 es un '500 Internal Server Error', y elmah y log4net están atrapando/registrando (¡ahora filtrado!).

Podría escribir un controlador específico y una ruta para manejar estas solicitudes no HTTPS según esta pregunta - Responding to HEAD Request in asp.NET MVC 3.

Pero, desde la perspectiva de los robots, ¿cuál sería la mejor respuesta? 200 para mostrar que el servidor está activo, un 302 redirigir a la url HTTPS, o seguir con el 500 ya que el sitio no es accesible a través de HTTP?

+0

500 no me parece bien ... no es Hay un código de estado para esto? 500 sugiere que en realidad hay un error en alguna parte. –

+1

Sugiero no lanzar un error 500. Si el sitio solo es accesible a través de HTTPS. Usaría un redireccionamiento 301 (permanente) en lugar de un 302 (temporal). También podría usar una regla de reescritura para redirigir todo el tráfico que no sea https a https resolviendo el problema. –

+0

Estoy de acuerdo con no lanzar el error 500, pero es el comportamiento predeterminado de MVC3: 'System.InvalidOperationException: solo se puede acceder al recurso solicitado a través de SSL. en System.Web.Mvc.RequireHttpsAttribute.HandleNonHttpsRequest (AuthorizationContext filterContext) en System.Web.Mvc.RequireHttpsAttribute.OnAuthorization (AuthorizationContext filterContext) en System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters (ControllerContext ControllerContext, filtros IList'1, ActionDescriptor actionDescriptor) – Chris

Respuesta

5

Se podría responder con

405 Method Not Allowed 

que significa

El método especificado en la Solicitud-Line no está permitido para el recurso identificado por el URI de solicitud. La respuesta DEBE incluir un encabezado Permitir que contenga una lista de métodos válidos para el recurso solicitado.

o con

501 Not Implemented 

lo que significa

El servidor no soporta la funcionalidad necesaria para cumplir con la solicitud. Esta es la respuesta adecuada cuando el servidor no reconoce el método de solicitud y no es capaz de soportarlo para ningún recurso.

Personalmente, me gustaría ir con la 405 ya que es un error en el lado del cliente, un "Hey hombre, que no sirven esas cosas aquí". me parece más apropiado que "¿De qué demonios estás hablando? No lo entiendo". uno, este último es sugerido por el el servidor no reconoce el método de solicitud poco de la descripción 501.

Todos los códigos de estado HTTP: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

1

En mi caso, lo único que estaba recibiendo peticiones cabeza en la raíz del sitio / que parece robots de sondeo. Entonces, estaba un poco preocupado por devolver un 500 o 404.

Más de 405

405 puede ser aceptable según la respuesta de Albireo, pero hay que devolver los verbos aceptados, algo así como:

// 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 opción

Buscando en el comentario en el código MVC que no redirecciona la solicitud HEAD:

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

Parece que otra opción es enviar un 302. Debe ser razonablemente seguro devolver un 302 al sitio HTTPS para que las solicitudes bot HEAD se enruten (que es lo que hace MVC para un GET). Por lo tanto, he implementado el siguiente, que se basa en la forma en que lo hace 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; 
} 

Implementar en global.asax.cs:

protected void Application_Error(object sender, EventArgs e) 
{ 
    //Your code here 
} 
Cuestiones relacionadas