404 страница, которая отображает запрашиваемую страницу - PullRequest
1 голос
/ 29 сентября 2008

Я недавно перенес сайт на новую CMS (Umbraco). Многие ссылки изменились, но их можно легко исправить, выполнив поиск по ссылкам в URL, поэтому я хотел бы написать что-то, что будет перенаправлять на правильную страницу, если старая не найдена. Эта часть не проблема.

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

request.ServerVariables("HTTP_REFERER") 'sorry i corrected the typo from system to server.

Но это не сработало.

Есть идеи?

Сайт находится на IIS 6.0. Мы рассматривали возможность использования перенаправлений 301, но у нас нет никакого способа узнать, какие страницы люди добавили в закладки, и есть несколько сотен страниц, поэтому никто не заинтересован в том, чтобы тратить время на создание 301-х.

Ответы [ 7 ]

3 голосов
/ 30 сентября 2008

Я делаю то же самое, что вы спрашиваете на пользовательской странице обработки ошибок 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();
    }
2 голосов
/ 29 сентября 2008

Многие ссылки изменились, но их легко исправить, выполнив поиск по ссылкам в URL

Вместо того, чтобы отправлять своих пользователей на 404, вы рассматривали возможность перезаписи URL? Таким образом, ваши пользователи (и поисковые системы, если это важно для вас в этом случае) получат 301 или 302 вместо того, чтобы проходить через ваш обработчик 404. Обычно на ваших серверах быстрее и менее сложно обрабатывать перезапись на уровне URL, чем запускать код и обрабатывать его там.

Microsoft выпустила Модуль перезаписи 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 можно обработать парой простых правил.

2 голосов
/ 29 сентября 2008

Как насчет:

Request.ServerVariables("HTTP_REFERER");
1 голос
/ 27 октября 2008

Чтобы воспользоваться предложением Rewrites, Umbraco уже использует UrlRewriting.NET, и новые изменения могут быть добавлены в

\config\UrlRewriting.config

Надеюсь, это поможет

1 голос
/ 30 сентября 2008

Вот что мы делаем на 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-адреса будет правильным решением.

1 голос
/ 29 сентября 2008

Вместо использования страницы 404, я думаю, что правильнее всего было бы перенаправить с кодом 301 - перемещено постоянно .

0 голосов
/ 29 сентября 2008

Обновление, вы действительно хотите забрать:

VB.NET:

Request.QueryString("aspxerrorpath")

C #:

Request.QueryString["aspxerrorpath"];
...