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.
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.
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
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';
}
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
$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
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
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=priceobič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
$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;
}
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
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
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.