404 страница, на которой отображается запрошенная страница

StackOverflow https://stackoverflow.com/questions/150329

Вопрос

Недавно я перенес веб-сайт на новую 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"];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top