404が見つかりません代わりに200 OKを返すASP.NETカスタム404

asp.net c# custom-errors http-status-code-404 master-pages
404が見つかりません代わりに200 OKを返すASP.NETカスタム404

私のサイトをGoogleウェブマスターツール用に設定しようとしたところ、私のカスタムASP.NET 404ページが404ステータスコードを返さないことがわかりました。 正しいカスタムページが表示され、ブラウザにすべて問題ないことが通知されました。 これはソフト404または偽404を考慮したものです。 グーグルはこれが嫌いです。 それで私はこの問題に関する多くの記事を見つけました、しかし私が望む解決策はうまくいかなかったようです。

私が働きたい解決策は、カスタム404ページのPage_Loadメソッドの背後にあるコードに次の2行を追加することです。

Response.Status = "404 Not Found";
Response.StatusCode = 404;

これはうまくいきません。 ページはまだ200 OKを返します。 ただし、次のコードを設計コードにハードコードすると正しく機能することがわかりました。

<%
    Response.Status = "404 Not Found";
    Response.StatusCode = 404;
%>

 ... Much more code ...

このページはマスターページを使用しています。 そして私は私のweb.configでカスタムエラーページを設定しています。 私はむしろコードビハインドオプションを使用したいのですが、ハックインラインコードをデザイン/レイアウトに入れないとうまく動作しないようです。

  74  17


ベストアンサー

溶液:

結局のところ、問題はマスターページの使用でした。 私は、ページのライフサイクルの後半でステータスコードを設定することで機能するようになりました。明らかにマスターページのレンダリングがそれをリセットしていたので、レンダリングメソッドをオーバーライドし、レンダリングが完了した後に設定します。

protected override void Render(HtmlTextWriter writer)
{
    base.Render(writer);
    Response.StatusCode = 404;
}

マスターページがいつステータスを設定しているのかを正確に知るためにもっと多くの作業を行うことができますが、それはあなたに任せます。

” ” ‘

元の投稿:

私はテストWebアプリをうまく動かすことができました、それは少なくともカスタムエラーページを表示して、404ステータスコードを返しました。 私はあなたのアプリの何が悪いのかあなたに言うことはできませんが、私は私が何をしたのかあなたに言うことができます:

1)カスタムエラー用にweb.configを編集しました。

__

__

2)404.aspxページを追加し、ステータスコードを404に設定しました。

__

public partial class _04 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.StatusCode = 404;
    }
}

__

それについては、私はAsp.Netによって処理され、存在しない任意のページ拡張子に移動した場合、私のフィドラーログは明らかに404を示しています、これはヘッダーです:

__

HTTP/1.1 404 Not Found
Server: Microsoft-IIS/5.1
Date: Sun, 07 Dec 2008 06:04:13 GMT
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 533

__

htmファイルのようにAsp.Netによって処理されていないページに移動しても、カスタムページは表示されず、IISによって設定されている404が表示されます。

ここにあなたとあなたの問題に役立つかもしれないいくつかのより多くの詳細に入る投稿があります、私のテストは新しいページへのリダイレクトをするので要求されたファイルのURLはほとんど失われます(クエリ文字列のそれを除いて) 。

ヘッダースパイレスポンス:

HTTP/1.1 404 Not Found
Date: Sun, 07 Dec 2008 06:21:20 GMT

69


私はカスタムページを404(これはASPXです)として表示したいという同様の問題を抱えていましたが、localhostではうまくいきましたが、リモートの訪問者が接続するとすぐに一般的なIIS 404が得られます。

これに対する解決策は追加することでした

Response.TrySkipIisCustomErrors = true;

Response.StatusCodeを変更する前に

27


IIS 7の解決策は、これをweb.configファイルに追加するだけです。

12


Response.End()を呼び出してレンダリングをスキップしてみてください…​

Response.Status = "404が見つかりません"; Response.StatusCode = 404; Response.End();戻る

10


多くのテストとトラブルシューティングの結果、ホスティングプロバイダによってはリターンコードを妨害する可能性があるようです。 コンテンツに「ハック」を適用することでこれを回避できました。

<%
// This code is required for host that do special 404 handling...
Response.Status = "404が見つかりません"; Response.StatusCode = 404; %>

これによって、ページは正しいリターンコードを返すことができます。

6


NET 3.5を使用しているasp.net Webフォームで次の設定を使用することで、この問題を回避できました。

ヘッダーに正しいHTTPステータスコードを使用してすべてのシナリオを処理するように独自に記述したので、私が実装したパターンはweb.config内の.NETのカスタムリダイレクトソリューションをバイパスします。

まず、web.configのcustomErrorsセクションは次のようになります。

この設定は、CustomErrorsモードがonに設定されていることを確認します。これは後で必要になります。また、error.htmのdefaultRedirectにall-else-failsオプションを提供します。 これは私が特定のエラーのためのハンドラを持っていないとき、または壊れたデータベース接続の行に沿って何かがあるときに役に立ちます。

次に、これがグローバルなasax Errorイベントです。

protected void Application_Error(オブジェクトセンダ、EventArgs e){HandleError(); }

private void HandleError(){var例外= Server.GetLastError(); if(exception == null)を返します。

var baseException = exception.GetBaseException();

bool errorHandled = _applicationErrorHandler.HandleError(baseException); if(!errorHandled)が返される。

var lastError = Server.GetLastError(); if(null!= lastError

このコードはエラー処理の責任を他のクラスに引き継いでいます。 エラーが処理されずにCustomErrorsがオンになっている場合は、本番環境にあり、エラーが処理されていないというケースがあります。 ユーザーがそれを見るのを防ぐためにここでそれをクリアしますが、Elmahにそれを記録するので何が起こっているのかわかります。

applicationErrorHandlerクラスは次のようになります。

public bool HandleError(Exception exception){if(exception == null)}はfalseを返します。

var baseException = exception.GetBaseException();

Elmah.ErrorSignal.FromCurrentContext()。発生(baseException);

if(!HttpContext.Current.IsCustomErrorEnabled)がfalseを返す場合

試してください{

var behavior = _responseBehaviorFactory.GetBehavior(例外); if(behavior!= null){behavior.ExecuteRedirect(); trueを返します。 catch(Exception ex){Elmah.ErrorSignal.FromCurrentContext()。Raise(ex);}をスローします。 falseを返します。 }

このクラスは基本的に、発行されたエラーの種類に適したエラーハンドラを見つけるためにコマンドパターンを使用します。 ほとんどすべてのエラーがより高いレベルの例外でラップされるため、このレベルでException.GetBaseException()を使用することが重要です。 たとえば、任意のaspxページから「throw new System.Exception()」を実行すると、System.Exceptionではなく、このレベルでHttpUnhandledExceptionが受信されます。

「ファクトリ」コードは単純で、次のようになります。

public ResponseBehaviorFactory(){_ Behaviors = new Dictionary> {{typeof(StoreException)、()=> new Found302StoreResponseBehavior()}、{typeof(HttpUnhandledException)、()=> new HttpExceptionResponseBehavior()}、{typeof(HttpException)、( )=> new HttpExceptionResponseBehavior()}、{typeof(Exception)、()=> new Found302DefaultResponseBehavior()}}; }

public IResponseBehavior GetBehavior(Exception exception){if(exception == null)の場合、新しいArgumentNullException( "exception")がスローされます。

Funcの動作bool tryGetValue = _behaviors.TryGetValue(exception.GetType()、outビヘイビア);

//ここでのデフォルト値:if(!tryGetValue)_behaviors.TryGetValue(typeof(Exception)、out behavior);

if(behavior == null)Elmah.ErrorSignal.FromCurrentContext()を発生させます(new Exception( "危険! この例外には動作が定義されていないため、ユーザーは黄色い画面の死を受けた可能性があります。 "、exception)); return behavior();}

最後に、拡張可能なエラー処理スキームの設定をしました。 定義されているそれぞれの「動作」には、エラーの種類に応じたカスタム実装があります。 たとえば、HTTP例外はステータスコードについて検査され、適切に処理されます。 404ステータスコードでは、Request.RedirectではなくServer.Transferが、ヘッダーに書き込まれた適切なステータスコードと共に必要になります。

お役に立てれば。

1


タイトルとURLをコピーしました