Как перебазировать гиперссылки и контент на странице ASP.NET? - PullRequest
0 голосов
/ 08 июня 2009

У меня есть страница 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 ]

0 голосов
/ 09 июня 2009

Статья Скотта Гу о переписывании 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 SP1)

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

0 голосов
/ 08 июня 2009

Когда вы устанавливаете обычные страницы ошибок, используется ли перенаправление или перезапись 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

...