Да, можно получить URL-адрес, который вызывает ошибку 404. Вам просто нужно убедиться, что IIS настроен правильно.
Есть два случая, которые необходимо обработать, в одном - ошибкаисходит из .aspx или другой страницы, обрабатываемой .NET, а другая - из-за неверной папки (как в вашем вопросе http://example.com/testurl
) или имени файла (например, * .htm), который не являетсяобрабатывается .NET.В IIS 7 вам необходимо настроить пользовательскую ошибку 404 в разделе «Страницы ошибок .NET» в разделе «ASP.NET» для вашего веб-приложения, а также в разделе «Страницы ошибок» в разделе «IIS».Изменения web.config в конечном итоге выглядят примерно так:
<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>
Примечание: перечисленный выше redirectMode = "ResponseRewrite" важен, если вы хотите, чтобы ваши 404 страницы действительно возвращали 404 сообщения, и я не думаю, чтоэто может быть установлено через IIS.
В моем примере я создал страницу с именем Error404.aspx для обработки всех 404 ошибок.Когда страница .NET (.aspx и т. Д.) Выдает исключение 404, исходное имя файла можно найти в переменной строки запроса aspxerrorpath.Когда обычный htm или другая страница вызывает ошибку 404, исходный путь можно прочитать из свойства Request.RawUrl.Я использовал следующий код на своей странице Error404.aspx для обработки любого случая:
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; }
}
По умолчанию страница ошибки 404 не возвращает код состояния 404, поэтому вам нужно установить его вручную.См. этот пост для более подробной информации.