2 czerwca 2026
Migracja domeny bez utraty SEO — z subdomeny Netlify na własny adres
- SEO
- Netlify
- Astro
- DevOps
Gdy przenosiłem to portfolio z piotrm.netlify.app na własną domenę pmdata.pl,
miałem jedną obawę: że przez jakiś czas obie wersje będą żyły równolegle, Google
zobaczy dwie identyczne strony i potraktuje to jako duplicate content. Obawa była
słuszna — ale rozwiązanie okazało się prostsze, niż się spodziewałem. Pod warunkiem,
że zrobi się cztery rzeczy w kodzie i trzy w Search Console. I że ominie się kilka
pułapek, których nie ma w żadnym poradniku.
Na czym polega problem
Subdomena hostingu (*.netlify.app, *.vercel.app) nie znika, gdy podepniesz własną
domenę. Działa dalej i serwuje tę samą treść. Dwa adresy, identyczna zawartość —
klasyczny duplicate content. Google sam zdecyduje, którą wersję indeksować,
i niekoniecznie wybierze tę, na której Ci zależy.
Celem migracji jest więc nie tylko „żeby działało pod nową domeną”, ale żeby cała wartość SEO przeszła na nowy adres, a stary przestał z nim konkurować.
Plan: cztery zmiany w kodzie
Projekt to statyczna strona w Astro hostowana na Netlify. Konfiguracja adresu siedzi w kilku miejscach:
1. Kanoniczny URL. W Astro to jedno pole site w astro.config.mjs. Z niego
generują się tagi <link rel="canonical">, Open Graph i sitemap — zmiana w jednym
miejscu propaguje się wszędzie.
// astro.config.mjs
export default defineConfig({
site: 'https://pmdata.pl', // było: piotrm.netlify.app
});
2. Sitemap w robots.txt. Wpis Sitemap: musi wskazywać nową domenę, inaczej
kierujesz boty pod stary adres.
3. Przekierowanie 301 z subdomeny — to jest sedno. W netlify.toml:
[[redirects]]
from = "https://piotrm.netlify.app/*"
to = "https://pmdata.pl/:splat"
status = 301
force = true
4. Przekierowanie www → domena główna — dla pewności, choć Netlify robi to sam dla domeny primary (patrz Pułapka 1). Dokładam regułę jawnie, żeby konfiguracja była czytelna i przenośna, gdybym kiedyś zmienił hosting.
Pułapka 1: www Netlify ogarnia sam, subdomeny
.netlify.app— nie. Gdy ustawisz domenę jako primary, Netlify automatycznie przekierowujewwwna wersję bez www. Ale subdomeny*.netlify.appnie przekierowuje — to musisz zrobić ręcznie regułą wnetlify.toml. I akurat bez tej reguły Change of Address w Search Console by nie przeszło (o tym niżej).
Canonical sam nie wystarczy. <link rel="canonical"> to dla Google sugestia, nie
rozkaz. Przy świeżej stronie bez backlinków zadziała, ale naprawdę czystym
rozwiązaniem jest twardy 301 — fizyczne przekierowanie, które nie zostawia miejsca
na interpretację.
Pułapka 2: zmiana nazwy projektu Netlify nie usuwa subdomeny. Pierwszy odruch, żeby pozbyć się starego adresu, to zmienić nazwę projektu w Netlify (
piotrm→ coś innego). To nic nie daje — dostajesz po prostu nową subdomenę (nowa-nazwa.netlify.app), a duplicate content zostaje. Subdomeny*.netlify.appnie da się wyłączyć. Jedyne wyjście to 301, nie zmiana nazwy.
Trzy kroki w Google Search Console
Kod to połowa roboty. Druga połowa to powiedzenie Google’owi, że się przeprowadzasz.
1. Nowa property dla domeny. Dodaj pmdata.pl jako property typu Domain
(nie URL-prefix) — pokrywa od razu http/https i www/bez-www. Weryfikacja przez
rekord TXT w DNS.
Pułapka 3: GTM nie zweryfikuje property typu Domain. Jeśli masz wpięty Google Tag Manager, kuszące jest zweryfikować przez niego własność. Ta metoda działa jednak tylko dla property typu URL-prefix. Dla Domain jedyna opcja to rekord TXT. A jeśli DNS trzyma hosting (u mnie Netlify DNS), rekord dodajesz w panelu hostingu, nie u rejestratora domeny.
2. Prześlij sitemap. W nowej property: Mapy witryn → pełny URL
https://pmdata.pl/sitemap-index.xml.
3. Change of Address. Najważniejszy krok — oficjalnie sygnalizuje Google „ta witryna się przeprowadza” i przyspiesza przeniesienie sygnałów rankingowych. W ustawieniach starej property (URL-prefix subdomeny) → Zmiana adresu → wskaż nową domenę.
Pułapka 4: Change of Address wymaga DZIAŁAJĄCEGO 301. Narzędzie nie zadziała, dopóki stary adres faktycznie nie przekierowuje 301 na nowy — i to musi być już na produkcji. U mnie najpierw wyrzuciło „weryfikacja się nie udała”, bo redirect nie był jeszcze zdeployowany. Kolejność jest sztywna: najpierw wdróż 301, poczekaj na deploy (
curl -Ina starym adresie powinno zwrócić301ilocation:z nowym URL-em), dopiero potem uruchom Change of Address.
Na koniec, dla małej strony, ręcznie zażądaj zaindeksowania najważniejszych adresów
(homepage, /artykuly/) przez „Sprawdzenie adresu URL” → „Żądaj indeksowania”. Resztę
podstron Google znajdzie sam przez sitemap.
Czego nie usuwać
Starej property w Search Console nie kasuj od razu. Change of Address wymaga, żeby obie istniały, a po migracji Google rekomenduje trzymać starą jeszcze kilka miesięcy — do monitorowania przenoszenia ruchu i zachowania danych historycznych.
Checklist migracji
sitew konfiguracji frameworka → nowa domenaSitemap:w robots.txt → nowa domena- 301 z subdomeny hostingu → nowa domena
- deploy + weryfikacja, że stary adres zwraca 301 (
curl -I) - nowa property (Domain) w Search Console + weryfikacja TXT
- sitemap przesłany w nowej property
- Change of Address w starej property
- żądanie indeksowania homepage
- stara property zostaje (nie kasować)
Ta checklista jest jednorazowa — odhaczasz raz i zamykasz temat. Spójność SEO po migracji to inna bajka: trzeba bez końca pilnować linkowania wewnętrznego, metadanych i martwych linków. U siebie oddałem to self-review loopowi z hookami, zamiast polegać na własnej pamięci.
Podsumowanie
Migracja domeny bez utraty SEO sprowadza się do dwóch zasad: jeden twardy 301 ze starego adresu na nowy i jeden wyraźny sygnał do Google przez Change of Address. Canonical pomaga, ale to 301 robi robotę. Reszta to pilnowanie kolejności — bo połowa pułapek bierze się z tego, że coś sprawdza się, zanim deploy zdąży wejść.