Подтвердить что ты не робот

Доступ к исходному URL-адресу на странице перенаправления IIS7 404

У меня есть страница .aspx как моя настраиваемая страница 404 на сайте, настроенном на IIS 7. Мне нужно получить исходный URL-адрес, который пользователь пытался получить, чтобы выполнить некоторую обработку на странице 404. Хитрость в том, что мне нужно специально обрабатывать 404, которые не содержат расширение .aspx(например, http://example.com/testurl), которые не попадают в раздел пользовательских ошибок ASP.NET. Я могу настроить IIS, чтобы указать на мой пользовательский 404, но в этот момент я не знаю, как получить мой оригинальный URL-адрес? Кто-нибудь знает, возможно ли это?

Спасибо,

Mike

4b9b3361

Ответ 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, поэтому вам нужно установить ее вручную. Подробнее см. этот пост.