2011-02-21 14 views
17

Mam stronę .aspx jako moją niestandardową stronę 404 w witrynie skonfigurowanej w usługach IIS 7. Muszę pobrać oryginalny adres URL, do którego użytkownik próbował uzyskać dostęp, aby wykonać niektóre operacje. przetwarzanie na stronie 404. Sztuką jest to, że muszę specjalnie obsługiwać 404, które nie zawierają rozszerzenia .aspx (np. http://example.com/testurl), które nie są przekierowywane przez sekcję błędów niestandardowych ASP.NET. Mogę skonfigurować usługi IIS tak, aby wskazywały na moje niestandardowe 404, ale w tym momencie nie wiem, jak uzyskać mój pierwotny adres URL? Czy ktoś wie, czy to jest możliwe?Uzyskiwanie dostępu do oryginalnego adresu URL na przekierowaniu IIS7 404 Strona

Dzięki,

Mike

+1

Czy masz szczęście ze swoim problemem? W razie potrzeby chętnie wyjaśnię moją odpowiedź. – rsbarro

Odpowiedz

24

Tak, to jest możliwe, aby uzyskać adres URL, który powoduje błąd 404, wystarczy upewnić się, że IIS poprawnie skonfigurowany.

Są dwa przypadki, w których musisz sobie poradzić, jeden jest, gdy błąd pochodzi z pliku .aspx lub innej strony obsługiwanej przez .NET, a drugi jest, gdy błąd pochodzi ze złego folderu (jak w twoim pytaniu , http://example.com/testurl) lub nazwa pliku (na przykład * .htm), która nie jest obsługiwana przez .NET. W IIS 7 musisz skonfigurować niestandardowy błąd 404 w sekcji "Strony błędów .NET" w sekcji "ASP.NET" dla swojej aplikacji internetowej, a także w sekcji "Strony błędów" w sekcji "Usługi IIS". Zmiany web.config końcu wygląda mniej więcej tak:

<system.web> 
    <!-- other system.web stuff --> 
    <customErrors defaultRedirect="/Error404.aspx" mode="On" redirectMode="ResponseRewrite"> 
     <error redirect="/Error404.aspx" statusCode="404" /> 
    </customErrors> 
</system.web> 
<system.webServer> 
    <!-- other system.webServer stuff --> 
    <httpErrors errorMode="Custom"> 
     <remove statusCode="404" subStatusCode="-1" /> 
     <error statusCode="404" prefixLanguageFilePath="" path="/Error404.aspx" responseMode="ExecuteURL" /> 
    </httpErrors> 
</system.webServer> 

Uwaga: redirectMode = „ResponseRewrite” wymienione powyżej jest ważne, jeśli chcesz, aby Twoje strony 404 do 404 wiadomości rzeczywiście wrócić i nie sądzę, że można ustawić za pomocą IIS.

W moim przykładzie utworzyłem stronę o nazwie Error404.aspx, aby obsłużyć wszystkie błędy 404. Gdy strona .NET (.aspx, etc) zgłasza wyjątek 404, oryginalna nazwa pliku znajduje się w zmiennej querystring aspxerrorpath. Gdy zwykła strona htm lub inna strona powoduje błąd 404, oryginalną ścieżkę można odczytać z właściwości Request.RawUrl. Użyłem następujący kod w mojej strony Error404.aspx do obsługi obu przypadkach:

public partial class Error404 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     OriginalUrl = Request.QueryString["aspxerrorpath"] ?? Request.RawUrl; 
     Server.ClearError(); 
     Response.Status = "404 not found"; 
     Response.StatusCode = 404; 
    } 

    public string OriginalUrl { get; private set; } 
} 

Domyślnie, strona 404 błędu nie będzie zwracać kod stanu 404, więc trzeba ustawić go ręcznie. Aby uzyskać więcej szczegółów, patrz this post.

+1

Dzięki .. użyto połączenia tego z tym artykułem http://www.agilewebtechnologies.com/blog/post/2007/11/18/Redirects-Using-404-Error-Handling-in-ASPNET-20-on- Shared-Hosting- (Part-4) .aspx, aby przekonwertować na przekierowanie 301. Dodano Response.AddHeader ("Location", OriginalUrl); Response.End(); na końcu kodu w Error404, aby wykonać zadanie. – Dave

+1

dzięki za jasną i szczegółową odpowiedź. Nie mogłem znaleźć czegoś takiego na witrynie microsoft i zmarnowałem ponad godzinę. – dvdmn

Powiązane problemy