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.
Czy masz szczęście ze swoim problemem? W razie potrzeby chętnie wyjaśnię moją odpowiedź. – rsbarro