5

では正常に動作していない私持っている私のGlobal.asaxの下部に以下の経路:MVC:404ルートが生産

//404 ERRORS: 
routes.MapRoute(
    "404-PageNotFound", 
    "{*url}", 
    new { controller = "Error", action = "PageNotFound" } 
); 

Visual Studioで正常に動作しますが、本番では、私はIISのエラーを取得していますページ。

URLがキャッチされないようにする必要があります。そのため、IISの観点からは404のURLはありません。 web.configで何かする必要がありますか?

注:私はではありません。は、404固有のURLにリダイレクトします。むしろ、私は要求されたURLで404エラーページを提供しています(私はこれがユーザビリティの観点から適切なアプローチであると信じています)。私のエラー制御装置において

UPDATE
、私は問題であるように思われ、Response.StatusCode = 404;を設定しています。これを削除してプロダクションに再デプロイすると、フレンドリーなエラーページが再び表示されます。 SEOの目的のために - - しかし、私はは、HTTPヘッダーで404個のステータスが必要です信じるので、私の質問は今、次のようになります。

改訂QUESTION
方法/なぜIISが応答を傍受し、そのを送信していますすぐに使える404エラーと、これをどうやって防ぐのですか?

** SOLUTION * *
Dommerが必要であった(と思う)Response.TrySkipIisCustomErrors=true;を示唆するために賞を取得します。しかし、2その他の重要な詳細があった:

  • カスタムエラーが(!当たり前)web.configファイルにににする必要がある、と
  • 404のアクションは、[HandleErrors]属性を持っている必要があります。
  • いくつかのURLは、「404-PageNotFound」以外の経路にマッピングされたが、無効なパラメータを含む、と私はにしたくないので、404ページにをリダイレクトする、取得可能性があるので、それはどこにでも
    仕事を作る

私は私のベースコントローラでこのアクションを作成しました:

[HandleError] 
public ActionResult NotFound() 
{ 
    Response.StatusCode = 404; 
    Response.TrySkipIisCustomErrors = true;  
    return View("PageNotFound", SearchUtilities.GetPageNotFoundModel(HttpContext.Request.RawUrl));   
} 

とベースを継承するすべてのコントローラのアクションで、私は単に私が無効なルートパラメータをキャッチしたときに、これを呼び出す必要があります:

return NotFound(); 

注:ない RedirectToAction()ケーキの上

アイシング:私はビューに生成され、渡されてきたモデルはGoogleの検索エンジンにURLの冗長なビットを供給についてです
フレンドリーな404ページに提案としてトップ3の結果を表示します。

+0

のようにしてみてください。それはかなりよく見えます! –

答えて

4

問題は、リクエストが以前のルートのいずれかと一致していて、失敗していることです。

// This will match too many things, so let's constrain it to those we know are valid 
    routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    new { controller = "Home|OtherController|AnotherController|..." } // regular expression matching all valid controllers 
); 

//404 ERRORS: 
routes.MapRoute(
    "404-PageNotFound", 
    "{*url}", 
    new { controller = "Error", action = "PageNotFound" } 
); 

あなたがはるかに包括的な答えをしたい場合は、これを見て:可能な解決策は、このような他のルートを制約しようとすることですHow can I properly handle 404 in ASP.NET MVC?

EDIT:

を取り除くためにカスタムIISエラーのエラーコントローラを次のように変更してみてください:

Response.StatusCode = 404; 
Response.TrySkipIisCustomErrors=true; // add this line 

MSDNドキュメント:http://msdn.microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors.aspx

+0

これはルートマッチングの問題ではないことが分かります。むしろ、私はそれがIIS7設定の問題だと思う。質問の私の更新を見てください。 – Faust

+0

私は助けてくれるビットを追加しました。 –

+0

TrySkipIisCustomErrorsのミスを間違えていることに注意してください。 – Faust

0

あなたはこの作業を持って嬉しい。この

routes.MapRoute(
       "Default", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "account", action = "index", id = UrlParameter.Optional } // Parameter defaults 
      ); 


routes.MapRoute(
         "404-PageNotFound", // Route name 
         "{*url}", 
         new { controller = "Error", action = "PageNotFound", id = UrlParameter.Optional } // Parameter defaults 
        ); 
+0

@Prassanth:404ルートの目的は予期しないリクエストをすべてキャッチすることです。そのためワイルドカード{* url}のルートパターンは非常に必要です。{controller}/{action}はしません。ところで、私は私の問題についてのより多くの情報を発見し、質問を改訂しました。 – Faust

+0

コードを編集しました – Prasanth

+0

IISでDNS設定のリダイレクトが必要になると思います。必要に応じてリダイレクトを行うようにDNSを設定してみてください – Prasanth