Velikou výhodou .NET frameworku a jeho ASP.NET, oproti původním ASP, je možnost použít interní rewrite (přepis) URL cesty. Tato možnost přestala být doménou Apache serveru a my si v tomto článku ukážeme jak na to. Zadáte-li například cestu „/256-klicove-slovo.aspx“, může být vnitřně přepsána na „/article.aspx?id=256“. Pro klienta a nejen pro něj se cesta ukazuje ve své přehlednější a kratší formě…

Proč přepisovat

Použití přepisu je velice vhodné, zvláště chceme-li stránky optimalizovat pro vyhledávače, které nejsou zrovna šťastné z přemíry parametrů v odkazech a nemusí-li, pak takové stránky ani neindexují. Kolik parametrů v cestě vyhledávač ještě překousne nelze obecně stanovit, každý má jiné normy, které se navíc občas mění.

Při procházení logů weblogu WebSky.cz a následném ověřování přímo na vyhledávačích jsem si všiml, že všechny fráze, přes které se lidé z vyhledávačů na weblog dostávají, má především Google zaindexovány na hlavní stránce a již ne v jednotlivých článcích. Bylo na čase s tím něco udělat, protože každá chycená dušička se na webu hodí, stejně jako v politice.

Rozdíl mezi původními a novými adresami

Původní adresy měly následující tvary a byly:

pro jeden záznam
ShowEntry.aspx?day=[rrrrmmdd]&time=[hhmmss]
pro celý den
ShowEntry.aspx?day=[rrrrmmdd]
pro měsíční archiv
ShowAllEntries.aspx?date=[rrrrmm]

Rozhodl jsem se, že úpravu zahrnující vložení klíčových slov do URL provádět nebudu a že vyzkouším pouze jenoduchý přepis cesty. Jako cílový stav jsem si stanovil tento tvar URL:

pro jeden záznam
[rrrrmmdd]-[hhmmss]-spot.html
pro celý den
[rrrrmmdd]-day.html
pro měsíční archív
[rrrrmm]-month.html

Hrátky s řetězci a snaha necyklit se

V global.asax, konkrétně v jejím code behind global.asax.cs, si musíme odchytit přístup co nejdříve, ideálním kandidátem je Application_BeginRequest. Dále jsem stanovil tato pravidla zpracování:

  1. Je-li požadavek na stránku ShowEntry.aspx nebo ShowAllEntries.aspx, provedu přesměrování na nový tvar URL. Tento krok dělám proto, abych donutil vyhledávače trvale si těchto nových adres všímat. Přesměrování neprovedu, je-li v URL parametr, který mi říká, že jde již o vnitřně přesměrovanou cestu.

    if (path.ToLower().IndexOf(„showentry.aspx“)>0)
    {
       // cely den
       if (Request.QueryString[„r“] == null && Request.QueryString[„time“] == null)
          Response.Redirect(„/“+Request.QueryString[„day“]+“-day.html“);
       // konkretni spot
       if (Request.QueryString[„r“] == null)
          Response.Redirect(„/“+Request.QueryString[„day“] + „-„+Request.QueryString[„time“] + „-spot.html“);
    }
    if (path.ToLower().IndexOf(„showallentries.aspx“)>0)
    {
    // v pripade,ze je pozadavek na starou url,
    // podivame se zda jde o rewrite, pokud ne presmerujeme
    if (Request.QueryString[„r“] == null)
    Response.Redirect(„/“+Request.QueryString[„date“]+“-month.html“);
    }

  2. Je-li požadavek na jinou aspx stránku, neudělám nic a nechám ji zpracovat.
  3. Je-li požadavek na stránku s příponou .html, pomocí regulárních výrazů získám části URL, které potřebuji. Do odkazu přidám jeden parametr navíc (r=1), aby nedošlo k zacyklení, a provedu vnitřní přepis cesty.

    if (path.ToLower().IndexOf(„.html“)>0)
    {
       if (path.ToLower().IndexOf(„-month.html“)>0)
       {// archiv
          pattern = „(^)/([0-9]+)-[^/]+$“;
          replacement = „$1/ShowAllEntries.aspx“;
          replacementQS = „r=1&date=$2“;
       }
       else if (path.ToLower().IndexOf(„-day.html“)>0)
       {// jeden den vsechny zaznamy
          pattern = „(^)/([0-9]+)[^/]+$“;
          replacement = „$1/ShowEntry.aspx“;
          replacementQS = „r=1&day=$2“;
       }
       else if (path.ToLower().IndexOf(„-spot.html“)>0)
       {// jeden zaznam
          pattern = „(^)/([0-9]+)-([0-9]+)[^/]+$“;
          replacement = „$1/ShowEntry.aspx“;
          replacementQS = „r=1&day=$2&time=$3“;
       }
       // ziskani QueryStringu
       qs = System.Text.RegularExpressions.Regex.Replace(path, pattern, replacementQS);
       // ziskani QueryStringu cesty
       path = System.Text.RegularExpressions.Regex.Replace(path, pattern, replacement);
       // prepis cesty
       System.Web.HttpContext.Current.RewritePath(path,““, qs);
    }

Vždyť zpracování HTML v ASP.NET nepojede

Jak jste si jistě všimli, používám pro soubory příponu .html. Aby takové soubory ASP.NET zpracovával stejně jako soubory se skripty, je nutné její zpracování zadat v administraci IIS serveru. Nad webovým sídlem pomocí kontextového menu vyvoláte Properties / Home Directory / Configuration. Zde si zkopírujete cestu třeba od přípony souboru .aspx – Edit a cestu, kterou potřebujete, najdete v políčku Executable. Další potřebnou hodnotou je obsah pole Verbs / Limit to. Podle tohoto vzoru vytvoříme nové zpracování (Add) pro přípony .html.

Malé shrnutí

  • Používejte krátké cesty, pokud možno bez parametrů, ASP.NET to zvládne a Google vás bude mít rád.
  • Nezahazujte staré adresy, musíte přesměrovávat, jinak přijdete o spoustu zpětných linků.
  • Regulární výrazy jsou mocným nástrojem pro hrátky s cestou.
  • Kód je zkoušen na MS frameworku 1.1

Kód není zřejmě dokonalý – je trochu vytržen z kontextu, kdy na původním serveru dochází ke zpracovávání více pravidel pro více domén. Pro ilustraci však, doufám, stačí. Při zařizování webu na „zelené louce“ odpadne samozřejmě problém s přesměrováním ze starých adres.

Související články

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět