Доступ к исходному URL на странице перенаправления IIS7 404 - PullRequest
17 голосов
/ 21 февраля 2011

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

Спасибо,

Майк

1 Ответ

24 голосов
/ 22 февраля 2011

Да, можно получить 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, поэтому вам нужно установить его вручную.См. этот пост для более подробной информации.

...