Blog / Tehnologija i razvoj / Web arhitektura

Kako strukturirati URL-ove
za SEO i održiv custom web

URL struktura nije samo kozmetika. Ona utječe na routing, canonical signale, interne linkove, sitemap, migracije, održavanje i način na koji korisnici i tražilice razumiju arhitekturu web stranice.

Struktura URL-ova, routing i canonical arhitektura web stranice

Dobra URL struktura izgleda jednostavno izvana, ali iza nje stoji niz tehničkih odluka: kako generirati slug, kako mapirati rute, hoće li URL imati trailing slash, kako rješavati stare adrese, kako izbjeći dupli sadržaj i kako osigurati da sitemap, canonical i interni linkovi uvijek pokazuju na istu glavnu verziju stranice.

Kratko pravilo: svaka javna stranica treba imati jedan glavni URL, jednu canonical adresu, jedno mjesto u internoj strukturi i predvidljivo ponašanje za stare ili alternativne verzije URL-a. Ako postoji više adresa za isti sadržaj, prije ili kasnije nastaje SEO i održavateljski šum.

1. URL je dio arhitekture, ne samo tekst u adresnoj traci

URL često tretiramo kao nešto što se odluči usput: uzme se naslov stranice, pretvori u slug i gotovo. Kod malih webova to može proći neko vrijeme, ali kako sadržaj raste, loša URL disciplina počne stvarati probleme. Duplicirane adrese, promijenjeni slugovi bez redirecta, parametri koji ulaze u indeks, neusklađeni canonicali i interni linkovi vrlo brzo razvodne strukturu.

Za SEO je važno da tražilica jasno vidi koja je glavna verzija sadržaja. Za developera je važno da routing ostane predvidljiv. Za korisnika je važno da URL bude čitljiv i stabilan. Dobra struktura mora zadovoljiti sva tri pogleda.

2. Prvo definirajte javne tipove stranica

Prije pisanja routinga treba znati koje vrste javnih stranica postoje. Poslovni web obično ima nekoliko glavnih tipova: statične stranice, usluge, blog objave, reference, landing stranice i kontakt. Svaki tip treba imati jasnu logiku URL-a.

Tip stranice
Dobar obrazac
Rizik lošeg obrasca
Usluga
/usluge/seo-optimizacija
Više varijanti istog sadržaja na /seo, /seo-usluge, /optimizacija.
Blog
/blog/kako-strukturirati-url-ove-za-seo
Datumi ili kategorije koje se kasnije mijenjaju bez potrebe.
Reference
/reference/naziv-projekta
Parametri i ID-jevi koji ne govore ništa korisniku ni tražilici.
Landing
/izrada-web-stranica-karlovac
Copy/paste lokacijske stranice koje kanibaliziraju glavne usluge.

3. Slug mora biti stabilan

Slug je dio URL-a koji najčešće nastaje iz naslova. Problem je što se naslov može mijenjati, ali URL ne bi trebalo često mijenjati. Jednom kada stranica uđe u indeks, dobije interne linkove ili vanjske linkove, slug postaje dio SEO povijesti stranice.

Zato slug treba generirati pažljivo, ali i čuvati od nepotrebnih promjena. Ako se naslov promijeni iz “Kako napraviti sigurnu kontakt formu” u “Sigurna PHP kontakt forma preko SMTP-a”, ne mora značiti da se URL mora mijenjati. Stabilnost je često vrednija od savršene usklađenosti s novim naslovom.

PHP Jednostavna slug normalizacija
<?php

function create_slug(string $title): string
{
    $map = [
        'č' => 'c', 'ć' => 'c', 'đ' => 'd',
        'š' => 's', 'ž' => 'z',
        'Č' => 'c', 'Ć' => 'c', 'Đ' => 'd',
        'Š' => 's', 'Ž' => 'z',
    ];

    $slug = strtr($title, $map);
    $slug = mb_strtolower($slug, 'UTF-8');
    $slug = preg_replace('/[^a-z0-9]+/', '-', $slug);
    $slug = trim((string) $slug, '-');

    return $slug !== '' ? $slug : 'stranica';
}
Važno: funkcija za slug generiranje je korisna kod stvaranja nove stranice, ali ne treba automatski mijenjati postojeći slug svaki put kada urednik promijeni naslov. Za postojeću stranicu slug mijenjajte samo uz 301 redirect i jasan razlog.

4. Routing tablica treba biti eksplicitna

Kod custom weba često je najčišće imati eksplicitnu mapu ruta za javne stranice. To ne znači da svaka stranica mora biti hardcodana zauvijek, ali važne money stranice i hubovi trebaju imati kontroliranu putanju. Dinamički routing je koristan za blog ili reference, ali ne smije stvarati nepredvidljive duplikate.

PHP routing Jednostavna mapa javnih ruta
<?php

$routes = [
    '/' => 'pages/home.php',
    '/o-nama' => 'pages/o-nama.php',
    '/usluge' => 'pages/usluge.php',
    '/usluge/seo-optimizacija' => 'pages/usluge-seo.php',
    '/blog' => 'pages/blog.php',
    '/kontakt' => 'pages/kontakt.php',
];

$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$path = rtrim($path, '/') ?: '/';

if (!isset($routes[$path])) {
    http_response_code(404);
    require 'pages/404.php';
    exit;
}

require $routes[$path];

Ovakav primjer je pojednostavljen, ali pokazuje bitnu stvar: prije renderiranja stranice znamo koja putanja postoji, koja ne postoji i koja datoteka je odgovorna za prikaz.

5. Trailing slash: odaberite jedno pravilo

Nije toliko važno hoće li URL završavati kosom crtom ili neće. Važno je da ne postoje obje verzije kao odvojene stranice. Ako je glavna verzija /blog, onda /blog/ treba redirectati ili canonicalom pokazivati na glavnu verziju. Još bolje, server neka odmah normalizira adresu.

PHP Normalizacija trailing slasha
<?php

function redirect_trailing_slash(string $path): void
{
    if ($path !== '/' && str_ends_with($path, '/')) {
        $target = rtrim($path, '/');

        if ($_SERVER['QUERY_STRING'] ?? '') {
            $target .= '?' . $_SERVER['QUERY_STRING'];
        }

        header('Location: ' . $target, true, 301);
        exit;
    }
}

6. Canonical URL mora dolaziti iz iste logike kao routing

Canonical ne bi trebao biti ručno prepisivan u svakoj stranici ako se može generirati iz provjerene route logike. Ručni canonical lako zaostane nakon promjene URL-a, migracije ili kopiranja templatea. Ako routing zna trenutnu glavnu putanju, canonical može biti dosljedan.

PHP Canonical helper
<?php

const BASE_URL = 'https://example.com';

function canonical_url(string $path): string
{
    $path = '/' . ltrim($path, '/');
    $path = $path !== '/' ? rtrim($path, '/') : '/';

    return rtrim(BASE_URL, '/') . $path;
}

// canonical_url('/blog/kako-strukturirati-url-ove-za-seo')
// https://example.com/blog/kako-strukturirati-url-ove-za-seo

Canonical je posebno važan kod blogova, filtera, parametara i stranica koje su dostupne kroz više putanja. Ako canonical ne prati routing, interna struktura i SEO signali se lako raziđu.

7. Query parametri ne smiju slučajno postati indeksirane stranice

Parametri su korisni za tracking, filtere, sortiranje i kampanje, ali često stvaraju duplicirane verzije iste stranice. Primjerice, /blog?utm_source=x ne bi trebao postati zasebna SEO stranica. Isto vrijedi za sortiranja i filtere ako ne postoji jasan razlog da se indeksiraju.

Parametri koje treba kontrolirati

  • UTM parametri trebaju zadržati canonical na čistoj verziji URL-a.
  • Sortiranja poput ?sort=price obično ne trebaju indeksiranje.
  • Filteri mogu biti indeksirani samo ako imaju stvarnu landing vrijednost.
  • Search rezultati na webu uglavnom ne trebaju u indeks.
  • Pagination treba imati jasnu logiku i ne smije stvarati beskonačan crawl prostor.

8. Redirect mapa čuva SEO povijest

Kada se URL promijeni, stara adresa ne smije samo nestati. Ako je stranica imala promet, interne linkove, vanjske linkove ili je već bila u Google indeksu, treba 301 redirect na novu relevantnu adresu. Redirect mapa je jednostavan način da migracije ostanu pod kontrolom.

PHP Jednostavna 301 redirect mapa
<?php

$redirects = [
    '/stari-blog/php-mail-forma' => '/blog/sigurna-php-kontakt-forma-smtp',
    '/web-dizajn' => '/usluge/izrada-web-stranica',
];

$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$path = rtrim((string) $path, '/') ?: '/';

if (isset($redirects[$path])) {
    header('Location: ' . $redirects[$path], true, 301);
    exit;
}
Nemojte redirectati sve na naslovnu. Ako stara stranica ima novu relevantnu zamjenu, redirect treba ići tamo. Ako nema zamjene, kvalitetan 404 ili 410 može biti pošteniji signal od masovnog redirecta na homepage.

9. Interni linkovi trebaju koristiti canonical putanje

Ako navigacija, blog kartice i CTA linkovi koriste različite verzije URL-a, šaljete miješane signale. Interni linkovi su jedan od najvažnijih načina da web sam sebi kaže koje su stranice centralne. Zato helperi za generiranje URL-ova nisu samo convenience, nego SEO disciplina.

PHP Helper za interne linkove
<?php

function url(string $path): string
{
    $path = '/' . ltrim($path, '/');
    $path = $path !== '/' ? rtrim($path, '/') : '/';

    return BASE_URL . $path;
}

// <a href="<?= url('/usluge/seo-optimizacija') ?>">SEO optimizacija</a>

10. Sitemap je rezultat strukture, ne ručni popis želja

Sitemap treba sadržavati javne URL-ove koje stvarno želite crawlat i indeksirati. Ne treba sadržavati testne stranice, parametarske varijante, duplicirane putanje ili stare URL-ove koji redirectaju. Ako je web custom, sitemap se može generirati iz iste liste javnih ruta i objavljenih dinamičkih stranica.

PHP Minimalni sitemap URL zapis
<?php

function sitemap_url(string $loc, DateTimeInterface $lastmod): string
{
    return sprintf(
        "<url>\n  <loc>%s</loc>\n  <lastmod>%s</lastmod>\n</url>",
        htmlspecialchars($loc, ENT_XML1),
        $lastmod->format('c')
    );
}

Lastmod treba mijenjati kada se stranica stvarno promijeni. Ako ga bumpate bez sadržajne promjene, signal s vremenom gubi vrijednost. Ako se doda nova blog kartica na hub, tada hub ima stvarnu promjenu. Ako se promijeni samo asset verzija bez sadržaja, lastmod obično ne treba dirati.

11. Kako izbjeći kanibalizaciju kroz URL strukturu

URL struktura može pomoći protiv kanibalizacije ako jasno razlikuje informativne članke od money stranica. Blog članak može objasniti problem, ali uslužna stranica treba ostati glavna komercijalna destinacija. Ako oba URL-a ciljaju potpuno isti intent, Google može imati problem odlučiti koju stranicu prikazati.

Zdrava podjela intent-a

  • /blog/... za vodiče, objašnjenja, usporedbe i how-to sadržaj.
  • /usluge/... za glavne usluge i komercijalni intent.
  • Lokacijski landing URL samo kada postoji stvarna lokalna vrijednost.
  • Blog treba linkati prema money stranici kada korisnik prelazi iz učenja u odluku.
  • Ne stvarati više URL-ova za isti pojam ako ne postoji jasna razlika u namjeri.

Zaključak: dobra URL struktura smanjuje budući kaos

Održiva URL struktura nije najatraktivniji dio web razvoja, ali je jedan od dijelova koji najviše pomaže dugoročno. Ako su routing, canonical URL, interni linkovi, redirecti i sitemap usklađeni, web je lakše održavati, lakše širiti i sigurnije optimizirati.

Kod custom webova ovo je posebna prednost: ne morate prihvatiti generičku strukturu platforme, nego možete isplanirati URL arhitekturu prema sadržaju, SEO ciljevima i stvarnom poslovnom flowu. Za povezane teme pogledajte i članke Canonical URL: kako spriječiti dupli sadržaj, Sitemap.xml i lastmod te interni linkovi i SEO autoritet.

Custom web razvoj SEO optimizacija