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