2011-12-15 70 views
8

我們通過使用控制器上的RequireHTTPS屬性,可以通過HTTPS訪問ASP.Net MVC3站點。在HTTPS專用站點上對HTTP HEAD請求的正確響應

我們正在接收大量的HTTP HEAD方法請求,主要來自似乎是Twitter機器人的東西。默認的ASP.Net/MVC3響應是'500內部服務器錯誤',並且正在被elmah和log4net(現在被濾除!)捕獲/記錄。

我可以編寫一個特定的控制器和路由來處理這些非HTTPS請求,根據這個問題 - Responding to HEAD Request in asp.NET MVC 3

但是,從機器人的角度來看,最好的迴應是什麼? 200以顯示服務器是否有效,302重定向到HTTPS url,或者堅持使用500,因爲該站點無法通過HTTP訪問?

+0

500看起來不正確...是不是有這樣的狀態代碼? 500表明實際上有一處錯誤。 – 2011-12-15 17:18:30

回答

5

您可以用

405 Method Not Allowed 

響應,這意味着

在Request-Line中指定的方法是不允許由請求URI標識的資源。響應必須包含一個Allow頭,其中包含請求資源的有效方法列表。

501 Not Implemented 

這意味着

服務器不支持執行該請求所需的功能。這是服務器無法識別請求方法並且無法支持任何資源的適當響應。

就個人而言,我會與405去,因爲它是在客戶端上的錯誤,一個「嘿,夥計,我們不提供這些東西在這裏。」 「似乎比我更適合」你到底在說什麼?我不明白。「一,後者是由建議服務器不能識別請求方法位的501說明。

所有HTTP狀態代碼:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html上這似乎是機器人探測現場/

1

在我而言,我只是得到HEAD請求。所以,我有點擔心回到500或404。

更多關於405

405可按照的Albireo的回答OK,但你需要返回接受動詞,是這樣的:

// 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選項

展望在未重定向HEAD請求的MVC代碼中註釋:

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

看起來另一種選擇是發送一個302.將一個302返回到HTTPS站點,以便將bot 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 
}