URL jako /produkty?cat=12&filter=novinky se špatně pamatují, špatně sdílejí a Google si s nimi v SEO zápasí. Hezké URL jako /produkty/elektronika/novinky/ jsou jednoznačně lepší volba — pro uživatele i pro vyhledávač. Ukážeme, jak je postavit v Nette routeru včetně filtrovacích stránek s více hodnotami.

Proč pretty URL záleží pro SEO

Čistá URL struktura je jednou ze součástí technického SEO. Google používá URL jako jeden ze signálů o obsahu stránky. Slovo ve slugu má jen mírný přínos pro pořadí ve vyhledávání, ale větší benefit je v uživatelském chování — lidé kliknou častěji na URL, která vypadá srozumitelně. Pro interní prolinkování a sociální sítě je to ještě výraznější.

Druhý důvod je technický: filtrovací stránky s různými kombinacemi query parametrů vytvářejí duplicitní obsah z pohledu Googlu (stejný seznam seřazený jinak), což dělá správu canonical URL bolestivou.

RouterFactory v Nette 3

Nette router je deklarativní — definujete URL vzor a presenter, framework se postará o směrování i generování URL přes n:href. Základ vypadá takhle:

$router->addRoute('produkty/<slug [a-z0-9-]+>', 'Produkty:detail');

Regex [a-z0-9-]+ vyžaduje, aby slug obsahoval jen malá písmena, číslice a pomlčky — to chrání před náhodnými URL útoky a zajišťuje konzistenci.

Slugifikace pro databázové entity

U slugu je dobrá praxe mít ho uložený přímo v databázi vedle ID:

  • ID: 12345 (interní)
  • slug: elektronika (zobrazený v URL)
  • title: „Elektronika" (zobrazený na stránce)

Když klient změní titulek kategorie, slug neměníte — jinak by se rozbily všechny existující odkazy. Slug nastavujete jednorázově při vytvoření a měníte jen ručně s promyšleným redirectem.

Filtrovací stránky s více hodnotami

Tady to začíná být zajímavé. Představte si filtr pracovních nabídek: kategorie + region. Klasický přístup s query stringem by byl:

/nabidky?occupation[0]=200900005®ion_id[0]=206696

Ale my chceme:

/nabidky/doprava-logistika/stredocesky/

Řešení v Nette: vlastní routa se dvěma slug parametry a vlastní filtr v presenteru:

$router->addRoute(
    'nabidky/<occupation [a-z0-9-]+>/<region [a-z0-9-]+>/?',
    'Nabidky:seznam'
);

Presenter pak slugy přeloží na ID kategorie/regionu a filtruje. Pro kombinace, které nedávají smysl (např. neexistující kombinace), vrátit 404 nebo přesměrovat na nadřazenou kategorii.

Redirecty ze starých URL

Když měníte z query stringů na pretty URL, staré URL musí 301 přesměrovat na nové, jinak přijdete o SEO hodnotu. V Nette to řešíme jednoduchým záchytným presenterem, který zachytí staré query parametry, přeloží je na nové slugy a udělá trvalé přesměrování.

Canonical URL

Bez ohledu na implementaci pretty URL nikdy nezapomeňte na <link rel="canonical"> v hlavičce. I když máte filtrovací URL hezky navržené, Google může najít variantu s query stringem (z reklamy nebo nějakého starého odkazu) a canonical mu řekne, která je hlavní.

Závěr

Pretty URL nejsou „nice to have" — jsou základní hygiena moderního webu. Implementace v Nette je promyšlená a flexibilní, díky čemuž zvládnete i složité filtrovací scénáře bez kompromisů. Pokud přemýšlíte o migraci ze starých query stringů, umíme s tím pomoct i na běžícím projektu.