sitemap.xml: ce este, cum se generează dinamic, ce trebuie să conțină
sitemap.xml spune Google ce URL-uri să viziteze și când au fost modificate. Cum se generează dinamic, ce trebuie să conțină și ce te scoate din index.
Cuprins
sitemap.xml este fișierul prin care le spui motoarelor de căutare ce URL-uri ai și când au fost modificate ultima oară. Este o hartă explicită a site-ului pe care Google o folosește ca punct de plecare pentru crawl, completând (nu înlocuind) descoperirea prin linkuri interne. Pentru site-uri cu pagini generate dinamic sau cu mii de URL-uri, sitemap-ul este diferența între a fi indexat repede și a aștepta săptămâni.
Specificația sitemap-ului este sitemaps.org (din 2006), suportată de toate motoarele majore. Folosește XML cu un schema minim: o listă de URL-uri cu metadata opțională (data modificării, frecvența schimbării, prioritate). Modern, doar loc și lastmod mai contează; restul câmpurilor sunt ignorate de Google.
Ce este sitemap.xml mai exact?
Un document XML care listează URL-uri canonice ale site-ului, cu metadate auxiliare. Limită hard: 50.000 URL-uri sau 50 MB necomprimat per fișier. Site-uri mai mari folosesc sitemap index files (un index XML care referă sitemap-uri parțiale) ca să stea sub limită.
Structura minimă:
<urlset>: root-ul, cu namespace declarat.<url>: o intrare per URL. Fiecare conține:<loc>: URL-ul complet (cu protocol și domeniu).<lastmod>: data ultimei modificări, în format ISO 8601 (2026-05-30sau2026-05-30T14:30:00Z).<changefreq>și<priority>: opționale, ignorate de Google de la 2017 încoace.
Pentru site-uri multilingve, fiecare URL poate avea blocuri <xhtml:link> imbricate cu informații hreflang, ceea ce evită duplicarea declarațiilor lingvistice în <head>-ul fiecărei pagini.
Cum arată conținutul lui?
Pentru un articol cu o singură versiune lingvistică:
<url>
<loc>https://crawlerra.com/blog/cum-scriem-articolele</loc>
<lastmod>2026-05-30</lastmod>
<xhtml:link rel="alternate" hreflang="ro" href="https://crawlerra.com/blog/cum-scriem-articolele"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://crawlerra.com/blog/cum-scriem-articolele"/>
</url>
Patru câmpuri să le iei în serios:
<loc>: URL absolut, cu protocol, fără query string-uri inutile, fără fragment (#). Trebuie să fie URL-ul canonic, nu un redirect.<lastmod>: data efectivă a ultimei modificări semnificative. Setezi pe „azi" la fiecare cerere și Google va ignora câmpul după câteva crawl-uri.- Hreflang prin
<xhtml:link>: dacă pagina are versiuni lingvistice, declară-le. Trebuie să fie consistent cu tag-urile din HTML. - Encoding: UTF-8. Caracterele speciale (&, <, >) trebuie codate ca entități XML, inclusiv în URL-uri cu query string.
Care sunt cele cinci capcane care îți strică crawl-ul?
- URL-uri non-canonice în sitemap. Listezi
example.com/page?utm=fbsauexample.com/page/când canonical-ul eexample.com/page. Google crawl-uiește dar nu indexează acea variantă, iar Search Console reportează „Indexed, not submitted in sitemap" peste „Submitted URL marked 'noindex'". - Lastmod fals universal. Setezi
lastmodla timestamp-ul cererii (build-date sau current date) pentru toate URL-urile, indiferent dacă pagina s-a schimbat sau nu. Google detectează că lastmod-ul tău nu corelează cu schimbările reale și ignoră complet câmpul. - URL-uri redirected, 404, sau noindex. Sitemap-ul trebuie să conțină doar URL-uri pe care vrei să fie indexate, care răspund 200 și care nu au meta robots noindex. Orice altceva diluează semnalul și aglomerează Search Console cu erori.
- Sitemap nepublicat sau inaccesibil. Generezi sitemap-ul perfect la
/sitemap.xmldar nginx îl servește cu autentificare basic-auth sau cu robots disallow. Verifică-l ca un crawler anonim cucurl -A "Googlebot". - Sitemap fără re-publish la deploy. Conținutul sitemap-ului e generat la build și înregistrat ca fișier static, dar deploy-urile parțiale nu regenerează sitemap-ul. URL-uri noi rămân nedeclarate până la următorul build complet.
Cum îl folosim noi la crawlerra?
Pe crawlerra.com, sitemap.xml este dinamic, servit de procesul SSR. La fiecare cerere către /sitemap.xml, handlerul Express din src/server.ts face o cerere internă către backend (http://127.0.0.1:8084/api/v1/articles/slugs?lang=ro) cu timeout de 4 secunde, primește un array compact cu slug, lastmod și data publicării, și compune XML-ul on the fly. Dacă backend-ul nu răspunde, sitemap-ul trece pe fallback cu URL-urile statice (/, /en, /blog), fără să întoarcă 500.
Patru clase de URL-uri sunt incluse explicit: marketing pages (homepage RO + EN), legal (privacy RO + EN), blog index (/blog), și fiecare articol publicat (/blog/:slug). Pentru fiecare articol, lastmod-ul vine direct din updated_at al rândului în Postgres, ceea ce înseamnă că Google vede schimbări reale, nu „azi pentru toate". Detaliile complete despre generarea SSR sunt în intrarea despre server-side rendering1; despre hreflang în sitemap, vezi entry-ul dedicat.
Robots.txt-ul nostru (static, în public/robots.txt) declară explicit URL-ul sitemap-ului prin directiva Sitemap: https://crawlerra.com/sitemap.xml. Asta îl face descoperibil pentru crawlere care nu primesc sitemap-ul direct prin Search Console (Bingbot, DuckDuckBot, sau crawlere de monitorizare third-party). În paralel, directivele Disallow: /admin/ și Disallow: /portal/ blochează zonele autentificate care nu trebuie crawl-uite niciodată; sitemap-ul nu le include oricum, dar dubla protecție face Search Console mai liniștit.
Cache-ul HTTP pentru sitemap-ul nostru este de 1 oră (Cache-Control: public, max-age=3600). E un compromis: prea scurt înseamnă fetch-uri inutile de la backend la fiecare cerere de crawler; prea lung înseamnă că un articol nou publicat la 14:01 apare în sitemap doar la 15:00. Pentru cadența noastră editorială (două articole pe săptămână), o oră de delay e acceptabil; site-uri cu publicare în real-time ar trebui să meargă pe 5 minute sau să invalideze cache-ul explicit la publish.
Cum verifici că Google îl folosește?
După un deploy, fă trei verificări. Curl ca crawler anonim: curl -sS https://crawlerra.com/sitemap.xml | head -30. Trebuie să vezi XML valid, fără autentificare, cu URL-urile actuale. Search Console → Sitemaps → submit URL-ul sitemap-ului tău și verifică statusul „Success" + numărul de URL-uri detectate. Updatarea Search Console e zilnică; nu te aștepta la efecte instant.
Pentru monitorizare continuă, verifică în Search Console secțiunea „Coverage" → „Valid pages from sitemap". Numărul ar trebui să crească pe măsură ce publici. Dacă vezi „Submitted URL not found (404)" sau „Submitted URL marked 'noindex'" în mod repetat, ai pagini în sitemap care nu ar trebui să fie acolo. Pentru JSON-LD-ul care însoțește fiecare URL, validează separat cu Rich Results Test; dacă cele două se contrazic (sitemap spune că pagina există dar JSON-LD-ul are date invalide), Google penalizează ambele semnale. Cum implementăm asta în Angular SSR este descris în ghidul pentru SSR; articolul nostru de manifestare editorială este un exemplu live de URL care apare corect în sitemap cu lastmod actualizat.
- Handlerul sitemap-ului face fetch către
http://127.0.0.1:8084/api/v1/articles/slugs?lang=rocuAbortControllersetat la 4 secunde și fallback la URL-urile statice dacă backend-ul nu răspunde.[crawlerra.sitemap_handler]
Întrebări frecvente
Am sitemap.xml dacă am doar 10 pagini?
Da, merită oricum. Costul de a-l avea e zero (un fișier mic, generat o dată), iar Google preferă să primească mereu un sitemap explicit. Pentru un site mic, sitemap-ul accelerează indexarea inițială și ajută Google să descopere pagini noi imediat ce le publici.
Static sau dinamic, care e mai bun?
Dinamic dacă publici frecvent, static dacă structura nu se schimbă. Site-uri cu CMS sau cu conținut generat (blog, dicționar, catalog) au sitemap dinamic la fiecare cerere sau la fiecare publish. Site-uri statice (documentație, marketing) pot avea sitemap generat la build și înregistrat în git, alături de cod.
Cât de des trebuie să-l reîmprospătez?
De fiecare dată când publici, editezi sau ștergi o pagină indexabilă. Google poate respecta lastmod pentru a re-crawl-ui doar paginile modificate, dar numai dacă valoarea e corectă. Lastmod-uri false (toate paginile setate la „azi") fac Google să ignore complet câmpul.
Pot include URL-uri externe?
Nu, sitemap-ul este doar pentru URL-urile aceluiași domeniu. Pentru subdomenii separate ai nevoie de sitemap-uri separate. Pentru indici cross-domeniu, folosește un sitemap index (<sitemapindex>) care referă sitemap-urile fiecărui subdomeniu, dar fiecare URL listat trebuie să fie pe domeniul propriu sitemap-ului care îl conține.
Robots.txt e legat de sitemap?
Da, dar e o legătură slabă. Bună practică e să declari URL-ul sitemap-ului în robots.txt cu directiva Sitemap:. Pentru Google asta e un hint, nu o obligație; mai important este să trimiți sitemap-ul direct din Search Console. Pentru alți boți (Bing, Yandex, DuckDuckGo) directiva din robots.txt poate fi singura cale prin care îl descoperă.