2009-08-14 11 views
5

podczas obsługi błędów 404 w ASP.NET czy można ustawić błędy 404, aby przekierować na stronę, która przesyła kod odpowiedzi 404 do przeglądarki lub powinien być użyty server.transfer, aby 404 nagłówek może zostać wysłany do przeglądarki, podczas gdy adres URL pozostaje taki sam?404 page response.redirect vs server.transfer

Odpowiedz

3

customErrors statusCode = "404" powoduje 302 tymczasowe przekierowanie, a następnie 404 (jeśli ustawiono to w kodzie strony 404).

Dlatego dodaje się powinno zrobić to za Ciebie w global.asax lub błędów HttpModule:

protected void Application_Error(Object sender, EventArgs e) 
    { 
     Exception exception = Server.GetLastError(); 
     if (exception is HttpUnhandledException) 
     { 
      if (exception.InnerException == null) 
      { 
       Server.Transfer(ERROR_PAGE_LOCATION, false); 
       return; 
      } 
      exception = exception.InnerException; 
     } 

     if (exception is HttpException) 
     { 
      if (((HttpException)exception).GetHttpCode() == 404) 
      { 
       Server.ClearError(); 
       Server.Transfer(NOT_FOUND_PAGE_LOCATION); 
       return; 
      } 
     } 

     if (Context != null && Context.IsCustomErrorEnabled) 
      Server.Transfer(ERROR_PAGE_LOCATION, false); 
     else 
      Log.Error("Unhandled exception trapped in Global.asax", exception); 
    } 

Edit: Aha, i Best way to implement a 404 in ASP.NET umieścić mnie na drodze do bezwzględnej Server.ClearError();

Zobacz stanowisko, które zrobiłem, które obejmuje to wszystko.

+0

Jestem ciekaw zobaczyć twój blog, ale na ironię strona nie została znaleziona. ;) – Korijn

+1

Och, ironia! Link został naprawiony. – Ted

2

Chciałbym użyć sekcji customerrors w pliku web.config, a następnie określić stronę, do której ma się udać 404.

<configuration> 
    <system.web> 
     <customErrors mode="On" defaultRedirect="Error.aspx"> 
      <error statusCode="404" redirect="404Error.aspx" /> 
     </customErrors> 
    </system.web> 
</configuration> 

Na stronie odbiorczej, jeśli chcesz jeszcze wysłać 404 można umieścić to w przypadku page_load:

Response.Status = "404 Not Found"; 
+3

Nadal wykonuje przekierowanie o temp. 302. – Ted

0

Moja rada jest, aby proces ASP.NET do pracy dla Ciebie w oparciu o twój web.config, ale jeśli naprawdę chcesz to zrobić w kodzie, powinieneś trzymać się serwera. Transfer spowoduje, że zaoszczędzisz odświeżenia.

1

Response.Redirect wykona 302 najpierw niż 404 na przekierowanej stronie. Serwer.Transfer zachowa adres URL, więc na żądanej stronie znajduje się 404.

Myślę, że wszystko sprowadza się do SEO. Sugeruję użycie Server.Transfer, ponieważ jest bardziej zrozumiałe dla przeglądarki/wyszukiwarki, że żądany adres URL nie został znaleziony. Jeśli użyjesz strony Response.Redirect, "tymczasowo" zostanie przekierowana na stronę nie znalezioną. To nie jest dobre ... 302 nie jest dobrym pomysłem.