Domanda

Di recente ho migrato un sito Web su un nuovo CMS (Umbraco). Molti link sono cambiati, ma possono essere facilmente corretti cercando gli schemi nell'URL, quindi vorrei scrivere qualcosa che reindirizzerebbe alla pagina corretta se non si trova quello vecchio. Quella parte non è un problema.

Come posso ottenere l'URL richiesto dopo il reindirizzamento del browser alla mia pagina 404 personalizzata. Ho provato a usare:

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

Ma non ha funzionato.

Qualche idea?

Il sito è su IIS 6.0. Abbiamo preso in considerazione l'utilizzo di reindirizzamenti 301, ma non abbiamo modo di sapere quali pagine sono state aggiunte ai segnalibri e ci sono alcune centinaia di pagine, quindi nessuno è interessato a dedicare del tempo alla creazione dei 301.

È stato utile?

Soluzione

Faccio sostanzialmente la stessa cosa che mi chiedi in una pagina di gestione degli errori 404 personalizzata. Su IIS 6 l'URL originale si trova nella stringa di query. Il codice seguente mostra come afferrare l'URL originale e quindi inoltrare l'utente. Nel mio caso sono passato dal vecchio ASP al nuovo ASP.NET, quindi tutte le pagine .asp dovevano essere inoltrate a pagine .aspx. Inoltre, alcuni URL sono cambiati, quindi cerco parole chiave nel vecchio URL e inoltra.

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

Altri suggerimenti

Che ne dici di:

Request.ServerVariables("HTTP_REFERER");
  

Molti link sono cambiati, ma possono essere facilmente corretti cercando gli schemi nell'URL

Invece di inviare i tuoi utenti a un 404, hai preso in considerazione l'utilizzo della riscrittura degli URL? In questo modo i tuoi utenti (e motori di ricerca, se questo è importante per te in questo caso) riceveranno un 301 o 302 piuttosto che dover passare attraverso il tuo gestore 404. Di solito è più veloce e meno stressante per i server gestire la riscrittura a livello di url che avviare il codice ed elaborarlo lì.

Microsoft ha rilasciato un Modulo di riscrittura URL per IIS 7 , e c'è una discreta introduzione qui e qui .

Per IIS 6, esiste un buona introduzione qui per far sì che la riscrittura degli URL funzioni con essa, leggermente diversa da IIS7.

Una regola di riscrittura di esempio sarebbe

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

ci sono alcune centinaia di pagine, quindi nessuno è interessato a spendere il tempo per creare i 301

Il bello delle regole di riscrittura è che non è necessario elencare per elencare esplicitamente tutte le pagine, ma è possibile scrivere regole che seguono lo stesso schema. Abbiamo dovuto fare qualcosa di simile recentemente, ed è sorprendente come molti degli URL spostati possano essere gestiti da un paio di semplici regole.

Invece di utilizzare una pagina 404, penso che la cosa giusta da fare sarebbe reindirizzare con un 301 - Spostato in modo permanente codice.

Ecco cosa facciamo su init nelle nostre 404 pagine:

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

CheckforRedirects ha quindi una logica personalizzata per abbinare vecchi URL a nuovi URL.

Direi che questo è l'approccio preferito (al contrario di 301 o riscrittura URL) se hai abbastanza informazioni internamente per abbinare un gran numero di URL dal vecchio sistema con il nuovo sistema - ad es. se hai una tabella che abbina vecchi ID con nuovi ID o qualcosa di simile.

Se esiste un modello coerente che è possibile utilizzare per mappare vecchi URL a nuovi URL con una regex, la riscrittura degli URL sarebbe la strada da percorrere.

Per basarsi sul suggerimento Rewrites, Umbraco utilizza già UrlRewriting.NET e nuove riscritture possono essere aggiunte a

\config\UrlRewriting.config

Spero che questo aiuti

Aggiorna, in realtà vuoi raccogliere:

VB.NET:

Request.QueryString("aspxerrorpath")

C #:

Request.QueryString["aspxerrorpath"];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top