2012-04-12 35 views
13

Nel caso in cui l'errore si è verificato sul mio sito web ho effettuare le seguenti operazioni:Come restituire la "propria" pagina 404 personalizzata?

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

e che la pagina ha il codice:

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

    Response.StatusCode = 404; 
} 

Se lavoro sul localhost poi insieme con 404 lo stato restituito per la pagina, pagina visualizza 'descrizione errore corretta'.

Una volta che ho pubblicato lo stesso codice su Internet, tutte le pagine con errori sono ancora visualizzate con codice di stato 404, ma non hanno il contenuto. Invece, hanno il messaggio di errore 404 standard:

404 - File o directory non trovato.

se la riga "Response.StatusCode = 404" è stata commentata, viene fornita la pagina corretta, ma ha 200 codice di stato.

Domanda: come restituire la pagina di errore facile da usare che nello stesso tempo ha il codice di errore 404 stato?

Ogni pensiero è benvenuto! Grazie mille in anticipo!

P.S. ASP.NET 4.0

+0

Ho sempre eseguito 404 pagine personalizzate allo stesso modo. 1) Trasferimento alla pagina di errore 2) copia della pagina di facile utilizzo e 404 sotto il cofano per i robot. Un sito in cui sto provando a farlo ora Sto avendo esattamente lo stesso problema: se aggiungo "Response.Status", viene visualizzato un 404 standard: rimuovi il response.status e viene visualizzata la copia della pagina ma restituisce 200 La mia ipotesi non istruita è qualcosa di cambiato nel framework .NET4 ... – Jag

risposta

6

È possibile ottenere ciò configurando il proprio file web.config. Si prega di controllare il link sottostante per un articolo, che spiega in fondo alla pagina, come visualizzare diverse pagine di errore personalizzate per diversi stati di errore HTTP.

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

Anche se è completamente corretto, consiglierei, se possibile, di non usare un ASPX per le pagine di errore. Se l'errore è correlato a qualcosa nel motore ASP, la pagina di errore potrebbe anche non caricarsi. – justabuzz

+0

Accetto @justabuzz, in realtà avevamo un'applicazione in cui ciò accadeva - "Inoltre, ASP .NET ha riscontrato un errore durante il tentativo per visualizzare la pagina di errore personalizzata per l'eccezione " –

+0

Penso che una pagina aspx per un 404 sia ok 'cos se è errata è probabile che mostri la pagina 500. Ma se quella è una pagina aspx ... – Jag

9

A ah!

Prova questo:

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

ho trovato non appena ho aggiunto Response.TrySkipIisCustomErrors=true prima di impostare il codice di stato, vorrei vedere la copia pagina normale e una 404 viene restituito. Senza questa riga viene visualizzata la pagina standard di IIS 404.

In alternativa, questo può essere impostato nel web.config in questo modo:

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

La cosa chiave qui è existingResponse="PassThrough"

Questo è stato aggiunto al IIS7 quindi è necessaria su siti in esecuzione in modalità integrata Pipeline .

Per maggiori informazioni: http://msdn.microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors.aspx

Aggiornamento Aggiornamento per clarrification/ulteriori informazioni come le persone sono ancora trovare questo utile. Vale la pena notare che se hai bisogno di una semplice pagina 404 generica usa il metodo web.config (e meglio rendilo una semplice pagina HTML).

Il metodo che descrivo funziona meglio se si dispone di un sito fortemente dinamico o CMS in cui una determinata pagina potrebbe potenzialmente restituire un 404 ma si desidera mostrare le informazioni relative ai visitatori.

Ad esempio, una pagina di offerte speciali (offerte/alcune-offerte) potrebbe eseguire una ricerca per l'offerta (qualche offerta) e se non esiste mostrare offerte alternative o correlate restituendo un 404 sotto il cofano. Per quanto riguarda il visitatore, è appena stato detto che l'offerta non è più disponibile ma sono ancora nella sezione offerte, ma stiamo anche dicendo ai robot di annullare l'indicizzazione dell'URL. Questo sarebbe molto più difficile da fare se ci fosse solo una pagina 404 generica.

2

per mostrare il vostro propria pagina con la corretta 404 statuscode, è possibile utilizzare il seguente codice:

1) Nel web.config aggiungere il seguente:

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

e:

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

2) Aggiungere un file 404.htm alla radice del tuo sito web:

<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> 

È possibile aggiungere contenuti al corpo di questo file e rimuovere l'aggiornamento META o semplicemente usare il refresh META per aprire una pagina all'interno del vostro CMS.

1

Combinando le risposte di Jag e di adt, ho ancora avuto un problema. Quando un gestore di file statici gestiva un 404 (a differenza di ASP.NET), ottenni una risposta vuota. (Lo stato è stato correttamente 404.)

Per risolvere il problema, ho dovuto aggiungere errorMode="Custom" all'elemento <httpErrors>. Se la pagina di errore utilizza ASP.NET, è necessario includere responseMode="ExecuteURL".

<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> 
Problemi correlati