2009-11-12 7 views
20

Dlaczego jest to, że ASP.App.Redirect.Redirect używa kodu statusu HTTP-302 ("Przeniesiony tymczasowo"), chociaż w większości przypadków kod statusu HTTP-301 ("Przeniesiony na stałe") byłoby bardziej odpowiednie?Response.Redirect kod stanu HTTP

Odpowiedz

39

Odpowiedzi o statusie 301 mają być buforowane i nie sądzę, że chcesz takie zachowanie dla większości przekierowań ASP/ASP.NET.

Program ASP.NET 4.0 ma w razie potrzeby metodę RedirectPermanent.

+8

+1 za poinformowanie nas o RedirectPermanent. – Heinzi

+0

Nowa metoda RedirectPermanent dostarczana z programem ASP.NET 4.0 jest całkiem przydatna! Niestety projekt, nad którym pracuję, działa 2.0 ... – Vinz

9

Jednym z powszechnych przypadków użycia Response.Redirect jest przeniesienie użytkownika na inną stronę kodu po stronie serwera po odświeżeniu, np. coś podobnego do linii

private void MyButton_Click(object sender, EventArgs e) 
{ 
    if (some condition) { 
     Response.Redirect("ShowProduct.aspx"); 
    } else { 
     Response.Redirect("SorryOutOfStock.aspx"); 
    } 
} 

W tych przypadkach 301 byłoby całkowicie błędne. W rzeczywistości myślę, że powyższy przypadek (warunkowe przeniesienie użytkownika na inną stronę po interakcji UI) jest znacznie bardziej powszechnym zastosowaniem Response.Redirect niż rzeczywisty ten scenariusz przeniesiony do innego adresu URL na zawsze (gdzie kod powrotu 301 byłby odpowiedni).

2

Oprócz odpowiedzi od Heinzi, jedynym podmiotem w Internecie, który prawdopodobnie zwróci większą uwagę na 301, będą wyszukiwarki. Większość przeglądarek nie śledzi i nie rejestruje 301, aby automatycznie przekierować wszelkie kolejne żądania dotyczące początkowego adresu URL. Przeglądarki traktują 301 identycznie jak traktują 302. Stąd 302 w dynamicznej zawartości, takiej jak wygenerowana w ASP.NET, jest całkiem odpowiednie.

+0

Tak, to są pająki szukające, o które się martwię. – Vinz

19

Używałem ten poręczny trwałe przekierowanie z sukcesu:

public void RedirectPermanent(string newPath) 
{ 
    HttpContext.Current.Response.Clear(); 
    HttpContext.Current.Response.Status = "301 Moved Permanently"; 
    HttpContext.Current.Response.AddHeader("Location", newPath); 
    HttpContext.Current.Response.End(); 
} 
+1

Używam również tego, ale zastanawiałem się, dlaczego muszę to zrobić "obejście". – Vinz

-1

Błąd otrzymujesz nie jest spowodowane response.redirect!

Kod statusu odpowiedzi HTTP 301 Przeniesiony na stałe służy do stałego przekierowania, co oznacza, że ​​bieżące łącza lub rekordy używające adresu URL, na który otrzymano odpowiedź Przenieś 301, powinny zostać zaktualizowane do nowego adresu URL podanego w polu Lokalizacja odpowiedzi .

+5

Byłoby dobrze, gdybyś nie zamieszczał linków do http://onfrnz.com/search w każdej z twoich odpowiedzi, to jest trochę spamerskie. Dzięki. – Kev