2012-04-12 8 views
13

Im Fall, wenn Fehler auf meiner Website aufgetreten ich folgendes tun:Wie man 'eigene' 404 benutzerdefinierte Seite zurückgibt?

 Server.Transfer("/error.aspx"); 

und diese Seite hat Code:

protected void Page_Load(object sender, EventArgs e) 
{ 
    ... 

    Response.StatusCode = 404; 
} 

Wenn ich auf dem lokalen Host arbeiten dann zusammen mit 404-Status für die zurück Seite, Seite zeigt 'richtige Fehlerbeschreibung' an.

Sobald ich den gleichen Code im Internet veröffentlicht habe, werden alle Seiten mit Fehlern immer noch mit 404 Statuscode angezeigt, aber die haben nicht den Inhalt. Stattdessen haben sie die Standard 404-Fehlermeldung:

404 - Datei oder Verzeichnis nicht gefunden.

Wenn die Zeile "Response.StatusCode = 404" auskommentiert wird, dann wird die richtige Seite bereitgestellt, aber sie hat 200 Statuscode.

Frage: wie man benutzerfreundliche Fehlerseite zurückgibt, die in der selben Zeit 404 Fehlerstatuscode hat?

Alle Gedanken sind willkommen! Vielen Dank im Voraus!

P.S. ASP.NET 4.0

+0

Ich habe immer benutzerdefinierte 404-Seiten in der gleichen Weise gemacht. 1) Transfer zur Fehlerseite 2) benutzerfreundliche Seitenkopie und ein 404 unter der Haube für Roboter. Eine Seite, die ich versuche, dies jetzt zu tun, habe ich genau das gleiche Problem - wenn ich "Response.Status" hinzufügen, dann wird ein Standard 404 angezeigt - entfernen Sie den response.status und die Kopie der Seite erscheint, aber eine 200 zurückgibt Meine ungebildete Vermutung ist etwas in .NET4 Framework geändert ... – Jag

Antwort

6

Sie können dies erreichen, indem Sie Ihre Datei web.config konfigurieren. Bitte überprüfen Sie den unten stehenden Link zu einem Artikel, der unten auf der Seite erläutert, wie Sie verschiedene benutzerdefinierte Fehlerseiten für verschiedene HTTP-Fehlerstatus anzeigen können.

12
<customErrors mode="On" defaultRedirect="~/Error/GenericErrorPage.aspx"> 

    <error statusCode="404" redirect="~/Error/404.aspx" /> 

</customErrors> 

http://msdn.microsoft.com/en-us/library/h0hfz6fc(v=vs.71).aspx

http://msdn.microsoft.com/en-us/library/aa479319.aspx

+6

Während es völlig korrekt ist, würde ich empfehlen, wenn möglich, kein ASPX für Fehlerseiten zu verwenden. Wenn der Fehler mit etwas in der ASP-Engine in Verbindung steht, wird die Fehlerseite möglicherweise ebenfalls nicht geladen. – justabuzz

+0

Ich stimme @justabuzz zu, wir hatten tatsächlich eine Anwendung, in der das früher passierte - "ASP.NET stieß außerdem beim Versuch auf einen Fehler um die benutzerdefinierte Fehlerseite für die Ausnahme anzuzeigen " –

+0

Ich denke, eine Aspx-Seite für eine 404 ist in Ordnung, denn wenn es Fehler, wird es wahrscheinlich die 500-Seite stattdessen angezeigt. Aber wenn das eine Aspx-Seite ist ... – Jag

9

A ha!

Try this:

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

ich, sobald ich Response.TrySkipIisCustomErrors=true hinzugefügt gefunden vor dem Statuscode einstellen, würde ich die normale Seite Kopie sehen und ein 404 zurückgeführt wird. Ohne diese Zeile wird die Standard-IIS ​​404-Seite angezeigt.

Alternativ kann dies wie so in der web.config eingestellt werden:

<system.webServer> 
    <httpErrors existingResponse="PassThrough"> 
     // custom error page mappings 
    </httpErrors> 
</system.webServer> 

Das Wichtigste hier existingResponse="PassThrough"

Dieser zu IIS7 hinzugefügt wurde somit auf Websites ist in der integrierten Pipeline-Modus laufen .

Für weitere Informationen: http://msdn.microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors.aspx

aktualisieren Aktualisierung für clarrification/weitere Informationen wie die Leute das nützlich noch zu finden sind. Es ist erwähnenswert, dass wenn Sie eine einfache, generische 404-Seite benötigen, verwenden Sie die web.config-Methode (und machen Sie es am besten eine einfache HTML-Seite).

Die Methode, die ich beschreibe, funktioniert am besten, wenn Sie eine stark dynamische oder CMS-getriebene Website haben, bei der eine bestimmte Seite möglicherweise einen 404 zurückgibt, Sie aber Ihre Besucherinformationen anzeigen möchten.

Zum Beispiel, eine spezielle Angebote Seite (Angebote/einige-Angebot) könnte eine Suche nach dem Angebot (einige-Angebot) und wenn es nicht existiert zeigen alternative oder verwandte Angebote, während eine 404 unter der Haube. Soweit dem Besucher bekannt ist, wurde ihm gerade gesagt, dass das Angebot nicht mehr verfügbar ist, aber es ist immer noch im Bereich Angebote, aber wir sagen Robotern auch, dass sie die URL nicht indexieren sollen. Dies wäre viel schwieriger zu tun, wenn es nur eine generische 404-Seite gäbe.

2

Um Ihre eigene Seite mit dem korrekt 404 Statuscode zu zeigen, können Sie den folgenden Code verwenden:

1) In Ihrem web.config fügen Sie den folgenden:

<customErrors mode="On" redirectMode="ResponseRewrite"> 
    <error statusCode="404" redirect="404.htm" /> 
</customErrors> 

und:

<httpErrors errorMode="Custom"> 
    <remove statusCode="404"/> 
    <error statusCode="404" path="404.htm" responseMode="File"/> 
</httpErrors> 

2) hinzufügen 404.htm Datei an die Wurzel Ihrer Website:

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>404 - Not Found</title> 
    <meta http-equiv="refresh" content="5;url=/404-PAGE" /> 
    </head> 
    <body> 
     CONTENT 
    </body> 
</html> 

Sie können entweder Inhalt auf den Körper dieser Datei hinzufügen und das Meta-Refresh entfernen oder einfach nur den Meta-Refresh verwenden, um eine Seite in Ihrem CMS zu öffnen.

1

Kombiniert Jag's und Adts Antworten, hatte ich immer noch ein Problem. Wenn ein 404 vom statischen Dateihandler behandelt wurde (im Gegensatz zu ASP.NET), erhielt ich eine leere Antwort. (Der Status war korrekt 404.)

Um es zu beheben, musste ich errorMode="Custom" zum <httpErrors> Element hinzufügen. Wenn Ihre Fehlerseite ASP.NET verwendet, müssen Sie responseMode="ExecuteURL" einschließen.

<system.web> 
    <customErrors mode="On" defaultRedirect="~/Error.aspx" redirectMode="ResponseRewrite" /> 
</system.web> 

<system.webServer> 
    <httpErrors errorMode="Custom"> 
     <remove statusCode="404" /> 
     <error statusCode="404" path="/Error.aspx" responseMode="ExecuteURL" /> 
    </httpErrors> 
</system.webServer> 
Verwandte Themen