Ответ 1
Да, можно получить 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 querystring. Когда обычная 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, поэтому вам нужно установить ее вручную. Подробнее см. этот пост.