Как перебазировать гиперссылки и контент на странице ASP.NET?

У меня есть страница ASP.NET для обработки "404 страница не найдена", это настройка путем настройки <customErrors> раздел в моем файле web.config и настройка пользовательской страницы ошибок для 404 ошибок в диспетчере IIS.

Он работает, как и ожидалось, для страниц в корне моего веб-сайта, но не работает в подкаталоге сайта - гиперссылки и контент на моей пользовательской странице ошибок имеют неправильную базу URL-адресов.

Все ссылки на моей странице ошибок являются серверными элементами управления (runat="server") и имеют свои ссылки, основанные на "~/".

Когда я просматриваю сайт с http://mysite/nosuchfolder/nosuchfile страница отображается со ссылками, думая, что она подается из корня, а не из nosuchfolder и поэтому все ссылки не работают в браузере, так как браузер базирует ссылки с nosuchfolder,

Есть ли какой-нибудь способ "сообщить" странице ASP.NET о необходимости заново создать ссылки на другую папку / имя файла?

Заметки:

  • Большая часть шаблона страницы отображается на главной странице.
  • Я использую IIS6 и установил пользовательскую ошибку 404 для URL: /error404.aspx
  • В моем файле web.config я настроил <customErrors> раздел для перенаправления на /error404.aspx
  • В качестве обходного пути я использую HTML <base> тег на странице, но я хочу избежать этого
  • Я не хочу менять все мои ссылки "~ /" на "/" или встроенный взлом

2 ответа

Решение

Статья Скотта Гу о переписывании URL поставила меня на правильный путь (так сказать!) - спасибо за подсказку, Джеймс.

Ответ заключается в использовании Context.RewritePath(newPath)

Вот код, который я использую на своей странице 404 -

protected override void Render(HtmlTextWriter writer)
{
    string rebase = Server.UrlDecode(Request.ServerVariables["QUERY_STRING"]);

    if (rebase.Length>10 && rebase.StartsWith("404;"))
    {
        try
        {
            rebase = new Uri(rebase.Substring(4)).AbsolutePath;
        }
        catch
        {
            rebase = "/";
        }
        finally
        {
            Context.RewritePath(rebase);
        }
    }

    base.Render(writer);
    Response.StatusCode = 404;
}

Для обработки отсутствующих страниц.aspx таким же образом, есть настройка в web.config называется redirectMode что вы выбрали ResponseRewrite

<customErrors mode="On" redirectMode="ResponseRewrite">
    <error statusCode="404" redirect="~/error404.aspx" />
</customErrors>

Это останавливает поведение по умолчанию перенаправления пользователя на ~/error404.aspx?aspxerrorpath=badfile

Примечание. Этот параметр является новым для последних пакетов обновления ASP.NET (например, Framework 3.5 с пакетом обновления 1).

Справочник по MSDN для redirectMode

Когда вы устанавливаете обычные страницы ошибок, используется ли перенаправление или перезапись URL? Проблема, которую вы описываете, является распространенной проблемой при реализации перезаписи URL в ASP.NET. По сути, при перезаписи URL процессору становится неясно, какой URL использовать при разборе URL. Число, если статьи / сообщения были написаны о том, как решить проблему.

http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx

http://searchengineland.com/url-rewriting-custom-error-pages-in-aspnet-20-12234

Другие вопросы по тегам