Vra

Ek het onlangs verhuis van 'n webwerf 'n nuwe CMS (Umbraco). Daar is baie van die skakels verander, maar hulle kan maklik reggestel word deur te soek vir patters in die url, so ek wil graag iets wat sal lei tot die korrekte bladsy as die ou een nie gevind skryf. Wat deel is nie 'n probleem.

Hoe kan ek die versoek URL te kry nadat die leser word getrek om my persoonlike 404 bladsy. Ek probeer om met behulp:

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

Maar dit het nie gewerk nie.

Enige idees?

Die webwerf is op IIS 6.0. Ons het oorweeg om 301 aansture, maar ons het nie manier om te weet watter bladsye mense het geboekmerk en daar is 'n paar honderd bladsye het, sodat niemand is gretig om op die tyd om die 301 se skep spandeer.

Was dit nuttig?

Oplossing

Ek doen basies dieselfde ding wat jy vra in 'n persoonlike 404 fouthantering bladsy. Op IIS 6 die oorspronklike URL is in die soektog string. Die kode hieronder wys hoe om die oorspronklike URL gryp en dan stuur die gebruiker. In my geval aangeskakel ek uit ou ASP nuwe ASP.NET, so al die Asp bladsye moes word aangestuur na bladsye Aspx. Ook 'n paar URLs verander so ek kyk vir sleutelwoorde in die ou URL en vorentoe.

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

Ander wenke

Hoe gaan dit:

Request.ServerVariables("HTTP_REFERER");
  

Daar is baie van die skakels verander, maar hulle kan maklik reggestel word deur te soek vir patters in die url

jou gebruikers Eerder as om te stuur na 'n 404, Het jy al oorweeg die gebruik van url re-skryf? Op hierdie manier jou gebruikers (en soekenjins, as dit vir jou belangrik is in hierdie geval) sal 'n 301 of 302 te kry eerder as om te gaan deur jou 404 hanteerder. Dis gewoonlik vinniger en minder stresvolle op jou bedieners om die herskryf hanteer by die url vlak as die afvuur van jou kode en die verwerking van dit daar.

Microsoft het 'n URL Rewrite module vrygestel vir IIS 7 , en daar is 'n ordentlike inleiding tot dit hier en hier .

Vir IIS 6, is daar 'n goeie intro hier te kry URL herskryf werk met dit, effens anders as IIS7.

'n Voorbeeld herschrijfregel sou wees

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

Daar is 'n paar honderd bladsye, sodat niemand is gretig om op die tyd om te skep besteding van die 301 se

Die skoonheid van herskryf reëls is dat jy nie nodig het om 'n lys van al jou bladsye uitdruklik lys, maar kan reëls wat dieselfde patroon volg skryf. Ons moes onlangs iets soortgelyks om dit te doen, en dit is verbasend hoeveel van die verskuif URLs deur 'n paar eenvoudige reëls kan hanteer.

In plaas van die gebruik van 'n 404 bladsy, ek dink die regte ding om te doen sou wees om te lei met 'n 301 -. Het permanent kode

Hier is wat ons doen op init op ons 404 bladsye:

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

CheckforRedirects het dan persoonlike logika aan te pas ou URL's met nuwe URL's.

Ek wil argumenteer dat dit die voorkeur benadering (in teenstelling met 301S of URL herskryf) as jy genoeg inligting intern aan te pas tot 'n groot aantal URL's van die ou stelsel met die nuwe stelsel - bv as jy 'n tafel wat ooreenstem met ou ID's met 'n nuwe ID's of iets soortgelyks.

As daar 'n bestendige patroon wat jy kan gebruik om ou URL's om nuwe URL's te karteer met 'n regex, al is, dan URL herskryf sou die manier om te gaan.

Om te bou op die herskryf voorstel, Umbraco gebruik reeds UrlRewriting.NET en nuwe herskryf kan bygevoeg word om

\config\UrlRewriting.config

Hoop dit help

Update, eintlik wil hê jy moet optel:

VB.NET:

Request.QueryString("aspxerrorpath")

C #:

Request.QueryString["aspxerrorpath"];
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top