Pergunta

Eu recentemente migrou de um site para um novo CMS (Umbraco). Um monte de ligações mudaram, mas eles podem ser facilmente corrigido através da procura de padrões na URL, então eu gostaria de escrever algo que irá redirecionar para a página correta se o antigo não é encontrado. Essa parte não é um problema.

Como posso obter a URL solicitada depois que o navegador é redirecionado para a minha página 404 personalizada. Eu tentei usar:

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

Mas isso não funcionou.

Alguma idéia?

O site está no IIS 6.0. Nós fez considere usar 301 redirecionamentos, mas não temos nenhuma maneira de saber o que páginas as pessoas têm marcado e há algumas centenas de páginas, para que ninguém está interessado em gastar o tempo para criar as 301 do.

Foi útil?

Solução

I fazem basicamente a mesma coisa que você perguntar em um costume de erro 404 página manuseio. No IIS 6 a URL original é na cadeia de consulta. O código a seguir mostra como capturar a URL original e, em seguida, encaminhar o usuário. No meu caso eu mudei de idade ASP para nova ASP.NET, então todas as páginas ASP teve que ser encaminhado para páginas.ASPX. Além disso, algumas URLs mudou assim que eu olhar para palavras-chave no URL antigo e para frente.

//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();
    }

Outras dicas

Como sobre: ??

Request.ServerVariables("HTTP_REFERER");

Um monte de ligações mudaram, mas eles podem ser facilmente corrigido através da procura de padrões na url

Ao invés de enviar seus usuários para um 404, você já pensou em usar url re-escreve? Desta forma, seus usuários (e os motores de busca, se isso é importante para você neste caso) vai ter um 301 ou 302 ao invés de ter que passar por seu manipulador de 404. É geralmente mais rápido e menos estressante em seus servidores para lidar com a reescrita no nível url do que disparar o seu código e processá-lo lá.

Microsoft lançaram um URL Rewrite Module for IIS 7 , e há uma introdução decente para ele aqui e aqui .

Para o IIS 6, há um boa introdução aqui para a obtenção de URL reescrever a trabalhar com ele, um pouco diferente do que IIS7.

Uma regra de exemplo reescrita seria

# $1 will contain the contents of (.*) - everything after new-dir/
RewriteRule /new-dir/(.*) /find_old_page.asp?code=$1 

existem algumas centenas de páginas, para que ninguém está interessado em gastar o tempo para criar as 301 do

A beleza de reescrever as regras é que você não precisa de lista para listar explicitamente todas as suas páginas, mas pode escrever regras que seguem o mesmo padrão. Nós tivemos que fazer algo semelhante a isto recentemente, e é surpreendente como muitas das urls movidos poderia ser tratado por um par de regras simples.

Em vez de usar uma página 404, eu acho que a coisa apropriada a fazer seria para redirecionar com um 301 -. Movido código permanentemente

Aqui está o que fazemos na inicialização em nossos 404 páginas:

Dim AttemptedUrl As String = Request.QueryString("aspxerrorpath")
If Len(AttemptedUrl) = 0 Then AttemptedUrl = Request.Url.Query
AttemptedUrl = LCase(AttemptedUrl)
CheckForRedirects(AttemptedUrl)

CheckforRedirects então tem lógica personalizada para corresponder-se URLs antigos com novos URLs.

Eu diria que esta é a abordagem preferida (ao contrário de 301s ou URL reescrita) Se você tem informação suficiente internamente para igualar-se um grande número de URLs do sistema antigo com o novo sistema - por exemplo, se você tiver uma tabela que combina IDs antigos com novas IDs ou algo similar.

Se há um padrão consistente que você pode usar para mapear URLs antigos para novos URLs com um regex, no entanto, em seguida, reescrita de URL seria o caminho a percorrer.

Para construir sobre a sugestão Rewrites, Umbraco já utiliza UrlRewriting.NET e novas regravações pode ser adicionado a

\config\UrlRewriting.config

Espero que isso ajude

Update, você realmente quiser pegar:

VB.NET:

Request.QueryString("aspxerrorpath")

C #:

Request.QueryString["aspxerrorpath"];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top