404 страница, на которой отображается запрошенная страница
-
02-07-2019 - |
Вопрос
Недавно я перенес веб-сайт на новую CMS (Umbraco).Многие ссылки изменились, но их можно легко исправить, выполнив поиск шаблонов в URL, поэтому я хотел бы написать что-нибудь, что перенаправит на нужную страницу, если старая не найдена.Эта часть не является проблемой.
Как я могу получить запрошенный URL-адрес после того, как браузер будет перенаправлен на мою пользовательскую страницу 404.Я пробовал использовать:
request.ServerVariables("HTTP_REFERER") 'sorry i corrected the typo from system to server.
Но это не сработало.
Есть какие-нибудь идеи?
Сайт находится на IIS 6.0.Мы рассматривали возможность использования 301 редиректа, но у нас нет никакого способа узнать, какие страницы люди добавили в закладки, а страниц всего несколько сотен, поэтому никому не хочется тратить время на создание 301-х.
Решение
Я делаю в основном то же самое, что вы задаете на пользовательской странице обработки ошибок 404.В IIS 6 исходный URL-адрес находится в строке запроса.Приведенный ниже код показывает, как получить исходный URL-адрес и затем переслать его пользователю.В моем случае я переключился со старого ASP на новый ASP.NET, поэтому все страницы .asp должны были быть перенаправлены на страницы .aspx.Кроме того, некоторые URL-адреса изменились, поэтому я ищу ключевые слова в старом URL и пересылаю.
//did the error go to a .ASP page? If so, append x (for .aspx) and
//issue a 301 permanently moved
//when we get an error, the querystring will be "404;<complete original URL>"
string targetPage = Request.RawUrl.Substring(Request.FilePath.Length);
if((null == targetPage) || (targetPage.Length == 0))
targetPage = "[home page]";
else
{
//find the original URL
if(targetPage[0] == '?')
{
if(-1 != targetPage.IndexOf("?aspxerrorpath="))
targetPage = targetPage.Substring(15); // ?aspxerrorpath=
else
targetPage = targetPage.Substring(5); // ?404;
}
else
{
if(-1 != targetPage.IndexOf("errorpath="))
targetPage = targetPage.Substring(14); // aspxerrorpath=
else
targetPage = targetPage.Substring(4); // 404;
}
}
string upperTarget = targetPage.ToUpper();
if((-1 == upperTarget.IndexOf(".ASPX")) && (-1 != upperTarget.IndexOf(".ASP")))
{
//this is a request for an .ASP page - permanently redirect to .aspx
targetPage = upperTarget.Replace(".ASP", ".ASPX");
//issue 301 redirect
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location",targetPage);
Response.End();
}
if(-1 != upperTarget.IndexOf("ORDER"))
{
//going to old order page -- forward to new page
Response.Redirect(WebRoot + "/order.aspx");
Response.End();
}
Другие советы
Как насчет:
Request.ServerVariables("HTTP_REFERER");
Многие ссылки изменились, но их можно легко исправить, выполнив поиск шаблонов в URL
Вместо того чтобы отправлять своих пользователей на 404, рассматривали ли вы возможность повторной записи URL-адресов?Таким образом, ваши пользователи (и поисковые системы, если это важно для вас в данном случае) получат 301 или 302 вместо того, чтобы проходить через ваш обработчик 404.Обычно на ваших серверах обработка перезаписи на уровне URL-адреса выполняется быстрее и менее напряженно, чем запуск вашего кода и обработка его там.
Корпорация Майкрософт выпустила Модуль перезаписи URL-адресов для IIS 7, и к нему есть достойное введение здесь и здесь.
Для IIS 6 существует хорошее вступление здесь к тому, чтобы заставить URL переписывать работу с ним, немного отличающуюся от IIS7.
Примером правила перезаписи может быть
# $1 will contain the contents of (.*) - everything after new-dir/
RewriteRule /new-dir/(.*) /find_old_page.asp?code=$1
там несколько сотен страниц, так что никому не хочется тратить время на создание 301-х
Прелесть правил перезаписи заключается в том, что вам не нужно составлять явный список всех ваших страниц, но вы можете писать правила, которые следуют тому же шаблону.Недавно нам пришлось сделать что-то похожее на это, и удивительно, как много перенесенных URL-адресов можно было обработать с помощью пары простых правил.
Вместо использования страницы 404, я думаю, правильнее было бы перенаправить с помощью 301 - Перемещен на постоянной основе код.
Вот что мы делаем с init на наших 404 страницах:
Dim AttemptedUrl As String = Request.QueryString("aspxerrorpath")
If Len(AttemptedUrl) = 0 Then AttemptedUrl = Request.Url.Query
AttemptedUrl = LCase(AttemptedUrl)
CheckForRedirects(AttemptedUrl)
Затем CheckforRedirects использует пользовательскую логику для сопоставления старых URL-адресов с новыми URL-адресами.
Я бы сказал, что это предпочтительный подход (в отличие от 301-х или перезаписи URL-адресов), если у вас достаточно внутренней информации для сопоставления большого количества URL-адресов из старой системы с новой системой - напримересли у вас есть таблица, которая сопоставляет старые идентификаторы с новыми идентификаторами или что-то подобное.
Однако, если существует согласованный шаблон, который вы можете использовать для сопоставления старых URL-адресов с новыми URL-адресами с регулярным выражением, то переписывание URL-адресов было бы правильным решением.
Чтобы развить предложение по перезаписи, Umbraco уже использует UrlRewriting.NET и новые перезаписи могут быть добавлены в
\config\UrlRewriting.config
Надеюсь, это поможет
Обновление, вы действительно хотите забрать:
VB.NET:
Request.QueryString("aspxerrorpath")
C#:
Request.QueryString["aspxerrorpath"];