2011-12-15 18 views
8

我々はRequireHTTPSは、コントローラ上の属性を使用することにより、ASP.Net MVC3サイトにHTTPS経由でのみアクセスを持っています。正しい応答

私たちは、主にTwitterのボットのように見える何から、数多くのHTTP HEADメソッドのリクエストを受けています。デフォルトのASP.Net/MVC3レスポンスは '500 Internal Server Error'で、elmahとlog4net(現在は除外されています)によってキャッチされ、ログされています。

が、私はこの質問のとおり、これらの非HTTPS要求を処理するために特定のコントローラとルートを書くことができ - Responding to HEAD Request in asp.NET MVC 3

しかし、ボットの観点から何が最良の応答でしょうか? 200はサーバーが生きていること、HTTPS URLへの302リダイレクト、またはHTTP経由でサイトにアクセスできない500を使用していることを示します。

+0

500を右いないようですが...ではありませんそこにステータスコードがありますか? 500は実際にどこかでエラーがあることを示しています。 –

+1

私は500エラーを投げないことをお勧めします。サイトがHTTPS経由でのみアクセス可能な場合。 302(一時的)の代わりに301リダイレクト(永続的)を使用します。書き換えルールを使用して、https以外のすべてのトラフィックをhttpsにリダイレクトして、問題を解決することもできます。 –

+0

500エラーを投げないことについて同意しますが、MVC3のデフォルトの動作です。 'System.InvalidOperationException:要求されたリソースにはSSL経由でしかアクセスできません。 System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext、IList'1フィルタでSystem.Web.Mvc.RequireHttpsAttribute.OnAuthorizationでSystem.Web.Mvc.RequireHttpsAttribute.HandleNonHttpsRequest(AuthorizationContext filterContext) (AuthorizationContext filterContext) において、 ActionDescriptor actionDescriptor) – Chris

答えて

5

あなたはリクエストラインで指定されたメソッドはRequest-URIによって識別されるリソースに対して許可されていません

を意味

405 Method Not Allowed 

で対応できます。レスポンスは、要求されたリソースに対して有効なメソッドのリストを含むAllowヘッダーを含まなければならない(MUST)。

または

サーバーが要求を満たすために必要な機能をサポートしないことを意味し

501 Not Implemented 

と。これは、サーバーが要求メソッドを認識せず、どのリソースに対してもそれをサポートできない場合の適切な応答です。個人的に

それは、クライアント側のエラーなので、私は405となるだろう、は「男ねえ、私たちはここにいるものを提供していません。」よりも私にはより適切と思われる「について、あなたは一体何を話している?私はそれを理解していません。」つが、後者は501記述の要求方法ビットを認識しないサーバによって示唆されています。

すべてのHTTPステータスコード:私の場合はhttp://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

1

、私は唯一の探査ロボットのように思えるサイト/のルート上のHEADリクエストを得ていました。だから、私は500または404を返すことについて少し心配していました。405

405上

もっとアルビレオの答えどおり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を送信することが考えられます.HOTへのボットHEAD要求(これはMVCがGETに対して行うものです)の302をHTTPSサイトに返すことは合理的に安全です。

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に実装します:だから、私はMVCはそれをしないという方法に基づいており、次の実装

protected void Application_Error(object sender, EventArgs e) 
{ 
    //Your code here 
} 
関連する問題