2011-02-21 2 views
17

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

Спасибо,

Майк

+1

Удалась ли ваша проблема? Я был бы рад прояснить мой ответ, если это необходимо. – rsbarro

ответ

24

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

+1

Спасибо .. использовали комбинацию этого с этой статьей http://www.agilewebtechnologies.com/blog/post/2007/11/18/Redirects-Using-404-Error-Handling-in-ASPNET-20-on- Shared-Hosting- (Part-4) .aspx для преобразования в 301 перенаправление. Добавлен Response.AddHeader («Location», OriginalUrl); Response.End(); до конца вашего кода в Error404, чтобы выполнить задание. – Dave

+1

спасибо за ваш четкий и подробный ответ. Я не мог найти что-то подобное на веб-сайте Microsoft и потратил впустую более 1 часа. – dvdmn

Смежные вопросы