Tisková verze článku  Poslat článek e-mailem  10. dubna 2007 | Radek Kropík | Komentáře (2)  

URL Rewriting v ASP.NET

U mnoha webových stránek se můžete setkat se zvláštním formátem URL adresy, a to tzv. "Cool URL“. Výjimkou není ani tento magazín, kdy například adresa nějakého článku může být třeba ve tvaru "/Clanky/80=zajimavy-clanek.aspx" namísto obvykle používaného formátu "/Clanek.aspx?idClanku=80“. Už na první pohled je jasné, že prvně uvedený formát adresy je pro čtenáře magazínu snadněji zapamatovatelný a co víc, takovýto formát adres mají raději i vyhledávače, kteří ji snáze zaindexují a přiřadí ji občas i dokonce větší váhu. Jak takové zajímavé adresy dosáhnout si povíme dále.

Metoda RewritePath

V tomto případě vstupuje do hry soubor global.asax a serverová metoda Application_BeginRequest. V těle této metody jde přistupovat k objektu HttpContext a volat zde metodu RewritePath, která provede samotné přemapování adresy. Funkce pro přemapování může vypadat například takto:

void Application_BeginRequest(Object sender, EventArgs e)
{
 string sUrl = HttpContext.Current.Request.Url.PathAndQuery;
 string sId;
 Match shoda;
 Regex rRegex = new Regex("/Clanky/(\\d+).aspx");
 shoda = rRegex.Match(sUrl, 0);
 if (shoda.Groups[1].Success)
   {
    sId = shoda.Groups[1].Value;
    HttpContext.Current.RewritePath
          ("../VypisClanek.aspx?idClanku=" +  sId);
    return;
  }
}

Tímto přemapováním můžeme používat například adresu ve tvaru server.cz/Clanky/XX.aspx, kde XX nahradíme ID článku. Zde je třeba říci, že adresář Clanky, který v příkladu uvádím, nemusí fyzicky vůbec existovat. Po zavolání metody RewritePath skutečně dojde k přepisu adresy a zpracuje se stránka VypisClanek.aspx přesně tak, jak jsme si přáli. Vše funguje přesně podle našeho přání, ale až do momentu, kdy na stránce VypisClanek.aspx provedeme PostBack – třeba když máme na stránce anketu, kometáře apod. V takovém případě bude PostBack proveden na adresu VypisClanek.aspx?idClanku=xxx, a máme adresu zase ve starém formátu, a to přece nechceme. Jedna z možností jak toto obejít, je zavolat metodu RewitePath ještě jednou a to v metodě Page_Load stránky VypisClanek.aspx, a to například takto:

protected void Page_Load(object sender, EventArgs e)
{
  int idClanku;
  string sId = Request.Params["idClanku"];
  Context.RewritePath(Request.RawUrl, "", "", true);
  if (Int32.TryParse(sId, out idClanku))
    {
      //Zde načteme článek z databáze podle id článku
    }
}

Jen ještě doplním, že je potřeba relativní odkazy ve stránce, kde používáme přemapování, tj. všechny href u odkazů, src u obrázků apod. adresovat relativně vzhledem k novému formátu adresy, popřípadě je adresovat absolutně k URL webu.

HttpHandlerFactory v akci

Druhou, a podle mě lepší možností pro přepis URL adresy je použití třídy implementující rozhraní IHttpHandlerFactory, která bude zpracovávat jí předané URL. Parametry se v tomto případě předávají pomocí kolekce Context.Items, dostupnou během celého procesu zpracování stránky. Příklad takovéto třídy může vypadat takto:

public class RemapUrl : IHttpHandlerFactory
{
 public IHttpHandler GetHandler(HttpContext Context,
 string requestType, string url, string pathTranslated)
 {
 string Path =
 Context.Request.AppRelativeCurrentExecutionFilePath.
 ToLower();
 string Page;
 if (Path.StartsWith("~/clanky/"))
 {
   Page = "~/VypisClanek.aspx";
 }

 Context.Items["idClanku"] = 
 System.IO.Path.GetFileNameWithoutExtension(pathTranslated);
 return PageParser.GetCompiledPageInstance(Page,
 Context.Server.MapPath(Page), Context);
 }

  public void ReleaseHandler(IHttpHandler handler)
  {
      
  }
}

Dále je třeba v souboru web.config v sekci system.web nastavit filtr, aby výše vytvořený Handler věděl, jaké požadavky má zpracovat.

<httpHandlers>
  <add verb="*" path="Clanky/*.aspx" type="RemapUrl" />
</httpHandlers>

A to je vlatně vše, co je zde potřeba k přepisování adresy udělat. K parametru idClanku lze pak přistupovat ve stránce VypisClanek.aspx pomocí Context.Items["idClanku“]. Samozřejmě i zde platí to, co jsme si výše řekli o adresování vložených odkazů a dalších objektů, jako jsou obrázky apod.

protected void Page_Load (object sender, EventArgs e)
{
  int.Parse(Context.Items["idClanku"].ToString())
  //Zde načteme článek z databáze podle id článku
}

Je teď jen na vás, kterou možnost si k přepisování URL vyberete. Samozřejmě je možné dále URL upravovat, například k ID článku přidat název článku, jako to vidíte v tomto magazínu. Ale to už je opravdu na vás, co dále s URL provedete, aby vypadala ještě lépe.


Radek Kropík




Komentáře k článku


Příspěvky vyjadřují stanovisko čtenářů, nikoliv provozovatelů serveru a redakce nenese odpovědnost za jejich obsah.

        #1
Gravatar
Tomáš Pupala

HttpHandlerFactory je super věc. Velmi mě ovšem zklamalo, že při nastavení na Medium Trust Level vyhodí metoda PageParser.GetCompiledPageInstance výjimku (Security.Exception). Nedalo by se to nějak objít?

        #2
Gravatar
Fantomasmag

Jedna z možností je nastavit v souboru web.config trust level na Full

<trust level="Full" originUrl="" />

což ale nejspíš nechcete, že?




     Komentáře k tomuto článku byly již uzavřeny.


Novinky a oznámení

19.10.11 - Nyní najdete nově u každého článku ikonu obálky. Pokud na ní kliknete, budete moci odeslat odkaz na vybraný článek na e-malovou adresu, kterou zadáte v zobrazivším se formuláři. Odpadá vám tak nutnost pro odeslání odkazu na zajímavý článek spouštět e-mailového klienta a zakládání nového e-mailu.

11.10.11 - Nově v magazínu naleznete tzv. QR kód, který obsahuje vždy adresu právě zobrazené stránky. Pokud máte zobrazenou některou z kategorií článků, obsahuje QR kód adresu této kategorie, pokud máte zobrazený článek, QR kód obsahuje adresu zobrazeného článku, v ostatních případech obsahuje QR kód hlavní adresu magazínu.

23.09.11 - V neděli 25.9.2011 v době mezi 1:00 a 5:00 hod. proběhl přesun služeb serveru na nový hardware. Za nedostupnost magazínu v době přesunu se vám omlouváme.


QR kód článku

QR kód článku

Aktualizace e-mailem

Nechcete, aby vám unikl nový článek? Není nic jednoduššího, než se zaregistrovat a kdykoliv vyjde v magazínu nový článek, dáme vám vědět e-mailem.




Ikonka pro Vás

Líbí se vám tento magazín a rádi byste ho nějak podpořili? Pokud máte své webové stránky, budeme vám vděčni, pokud si na ně přidáte naší ikonku. Stačí přidat na váš web HTML kód, kderý najdete zde.


Partnerské weby


Naši fanoušci na Facebooku


Statistika


Reklama