Przekierowanie 301: co to jest i jak je zrobić

Gotowe przykłady dla Apache, nginx, WordPressa i Cloudflare, sposób na sprawdzenie, czy przekierowanie działa, i błędy, przez które Google pokazuje stary adres.

Aktualizacja: Zespół Search Experts

Ilustracja: drogowskaz ze starym adresem kieruje jedną strzałką na nowy adres strony
Spis treści
  1. Krótka odpowiedź: co to jest przekierowanie 301
  2. Przekierowanie 301 a 302, 307 i 308
  3. Kiedy stosować przekierowanie 301
  4. Przekierowanie 301 w .htaccess (Apache)
  5. Przekierowanie 301 w nginx
  6. Przekierowanie 301 w WordPressie
  7. Przekierowania w Cloudflare
  8. Przekierowanie domeny, HTTPS i www
  9. Jak sprawdzić, czy przekierowanie działa
  10. Najczęstsze błędy

Zmieniasz domenę, platformę albo strukturę adresów?

Jak przeprowadzamy migrację

Krótka odpowiedź: co to jest przekierowanie 301

Przekierowanie 301 to odpowiedź serwera „Moved Permanently”: strona przeniosła się na stałe pod nowy adres. Przeglądarka i robot Google przechodzą od razu na nowy adres, a Google pokazuje w wynikach adres docelowy. Według dokumentacji Google przekierowania stałe nie powodują utraty PageRanku, czyli wartości z linków prowadzących do starego adresu.

Ustawisz je w konfiguracji serwera (Apache, nginx), we wtyczce lub panelu CMS albo w usłudze typu Cloudflare. Poniżej gotowe przykłady dla każdego z tych miejsc i sposób, żeby sprawdzić, czy działa.

Przekierowanie 301 a 302, 307 i 308

Google dzieli przekierowania na stałe i tymczasowe. Od tego zależy, który adres zobaczysz w wynikach.

KodRodzajCo pokazuje GoogleKiedy używać
301stałeadres docelowytrwała zmiana adresu, domeny, struktury
308stałeadres docelowyjak 301, gdy pod adresem działają też formularze wysyłane metodą POST
302tymczasoweadres źródłowyzmiana na krótko, na przykład strona w przebudowie
307tymczasoweadres źródłowyjak 302, z zachowaniem metody POST

Dla Google kod 308 to odpowiednik 301, a 307 odpowiednik 302. Różnica dotyczy przeglądarek: przy 301 i 302 część z nich zmienia wysyłany formularz na zwykłe zapytanie GET, a przy 307 i 308 metoda zostaje bez zmian. Dla zwykłych podstron wybór między 301 a 308 nie ma znaczenia dla Google.

Google radzi używać przekierowań stałych tylko wtedy, gdy masz pewność, że ich nie cofniesz, i zaleca stałe przekierowanie po stronie serwera wszędzie, gdzie to możliwe. Przekierowanie w JavaScripcie Google może w ogóle nie zobaczyć, jeśli nie wyrenderuje strony.

Kiedy stosować przekierowanie 301

  • zmieniasz adres podstrony, na przykład nazwę kategorii w sklepie;
  • łączysz dwie strony o tym samym temacie w jedną;
  • usuwasz produkt lub wpis, który ma dobry odpowiednik;
  • przenosisz serwis na nową domenę albo nową platformę, na której zmieniają się adresy stron;
  • przechodzisz z http:// na https:// albo wybierasz jedną wersję: z www lub bez.

Jeśli usunięta strona nie ma odpowiednika, nie przekierowuj jej na siłę. Zwróć kod 404 albo 410.

Przekierowanie 301 w .htaccess (Apache)

Na wielu hostingach współdzielonych działa Apache albo zgodny z nim LiteSpeed, a przekierowania wpisujesz w pliku .htaccess w głównym katalogu strony. Najprostsza jest dyrektywa Redirect:

Redirect 301 "/stara-strona/" "https://firma.pl/nowa-strona/"

Uważaj na jeden szczegół: według dokumentacji Apache Redirect bez podanego kodu zwraca 302, czyli przekierowanie tymczasowe. Zawsze dopisuj 301 albo słowo permanent. Redirect dopasowuje też początek ścieżki i dokleja resztę, więc reguła dla /blog/ obejmie wszystkie wpisy pod tym adresem.

Gdy potrzebujesz wzorca, użyj RedirectMatch z wyrażeniem regularnym:

RedirectMatch 301 "^/aktualnosci/(.*)$" "https://firma.pl/blog/$1"

Przejście na HTTPS w .htaccess zrobisz modułem mod_rewrite:

RewriteEngine On
RewriteCond "%{HTTPS}" !=on
RewriteRule "^(.*)$" "https://%{HTTP_HOST}/$1" [R=301,L]

Dokumentacja Apache zaleca mod_rewrite tylko wtedy, gdy masz dostęp wyłącznie do .htaccess. Jeśli możesz edytować konfigurację serwera, prostsza i wydajniejsza jest dyrektywa Redirect w osobnym bloku <VirtualHost>.

W WordPressie plik .htaccess zawiera blok między # BEGIN WordPress a # END WordPress. WordPress nadpisuje treść między tymi znacznikami, więc własne reguły wpisuj poza nim, najlepiej nad nim.

Przekierowanie 301 w nginx

W nginx przekierowanie ustawia dyrektywa return w bloku server albo location:

location = /stara-strona/ {
    return 301 https://firma.pl/nowa-strona/;
}

Sam adres bez kodu (return https://...;) nginx traktuje jak przekierowanie 302. Kod 301 trzeba podać wprost. Przy dyrektywie rewrite flaga permanent daje 301, a redirect daje 302. Po zmianie konfiguracji serwer trzeba przeładować, więc zwykle robi to administrator albo firma hostingowa.

Przekierowanie 301 w WordPressie

WordPress sam przekierowuje stary adres wpisu po zmianie jego końcówki (tak zwanego sluga), i robi to kodem 301. Do innych przekierowań masz trzy drogi:

  1. Wtyczka do przekierowań. Wpisujesz stary adres, nowy adres i wybierasz kod 301. Sprawdź, jaki kod wtyczka ustawia domyślnie.
  2. Panel hostingu. Część firm hostingowych ma w panelu formularz do ustawiania przekierowań bez edycji plików.
  3. Plik .htaccess. Reguły z poprzedniej części, wpisane nad blokiem WordPressa.

Wybierz jedno miejsce i trzymaj tam wszystkie przekierowania. Reguły rozrzucone między wtyczkę, panel i .htaccess mogą się ze sobą kłócić i dawać pętle.

Przekierowania w Cloudflare

Jeśli domena działa przez Cloudflare, przekierowanie możesz ustawić, zanim zapytanie dotrze do serwera. Do takich przekierowań służą dwa narzędzia Cloudflare:

  • Redirect Rules (Single Redirects) działają dla jednej domeny lub subdomeny i obsługują wzorce, więc jedna reguła obejmie wiele adresów. Ścieżka w panelu: Rules, Overview, Create rule, Redirect Rule. Wybierasz warunek, adres docelowy, kod (na przykład 301) i decydujesz, czy zachować parametry adresu.
  • Bulk Redirects to długie listy par „stary adres, nowy adres” na poziomie konta, także dla kilku domen. Listę wgrywasz z pliku CSV albo wpisujesz ręcznie, a potem włączasz ją osobną regułą (Bulk Redirect Rule). Te przekierowania nie obsługują wyrażeń regularnych.

Bulk Redirects przydają się po migracji, gdy masz gotową mapę setek albo tysięcy adresów.

Przekierowanie domeny, HTTPS i www

Przy zmianie domeny każdy stary adres kieruje na swój odpowiednik w nowej domenie, z zachowaniem ścieżki. Po stronie Google zgłaszasz też zmianę w narzędziu zmiany adresu w Search Console. Przy przejściu na HTTPS i przy wyborze wersji z www lub bez narzędzie nie jest potrzebne. Cały proces opisujemy w tekście zmiana domeny a pozycjonowanie.

Dwa kroki: osobne reguły dla HTTPS i www

http://www.firma.plhttps://www.firma.plhttps://firma.pl

Każda reguła działa poprawnie, ale razem tworzą łańcuch.

Jeden krok: od razu na adres docelowy

http://www.firma.plhttps://firma.pl

Każdy wariant adresu kieruje prosto na wersję, którą chcesz mieć w Google.

Google zaleca kierować od razu na adres końcowy, a łańcuch trzymać najlepiej do 3 kroków i poniżej 5.

Przykład dla Apache w .htaccess: każdy wariant adresu, który nie jest https://firma.pl, trafia tam jednym krokiem. Reguła sprawdza %{HTTPS}, więc gdy przed serwerem stoi Cloudflare albo inny serwer pośredniczący, który sam obsługuje HTTPS, może dać pętlę. Wtedy ustaw przekierowanie na HTTPS w Cloudflare albo sprawdzaj nagłówek X-Forwarded-Proto, jeśli ustawia go serwer pośredniczący, którym zarządzasz i który nadpisuje ten nagłówek przy każdym zapytaniu.

RewriteEngine On
RewriteCond "%{HTTPS}" !=on [OR]
RewriteCond "%{HTTP_HOST}" "^www\." [NC]
RewriteRule "^(.*)$" "https://firma.pl/$1" [R=301,L]

W nginx ten sam efekt da osobny blok server dla wariantów, które chcesz przekierować:

server {
    listen 80;
    server_name firma.pl www.firma.pl;
    return 301 https://firma.pl$request_uri;
}

Wersja HTTPS z www potrzebuje jeszcze takiego samego przekierowania w bloku z certyfikatem.

Jak sprawdzić, czy przekierowanie działa

Najszybciej w terminalu. Polecenie curl -I pobiera same nagłówki odpowiedzi:

curl -I https://firma.pl/stara-strona/

W wyniku szukasz dwóch linii: HTTP/1.1 301 Moved Permanently (albo HTTP/2 301) i location: z nowym adresem. Żeby zobaczyć cały łańcuch, dodaj -L:

curl -sIL http://www.firma.pl/stara-strona/ | grep -iE "^HTTP|^location"

Poprawny wynik to jedno 301 i na końcu kod 200.

Bez terminala: w przeglądarce otwórz narzędzia dla programistów (F12 w Windows i Linuksie, Command+Option+I na Macu), zakładkę Sieć, zaznacz opcję zachowania dziennika i wpisz stary adres. Pierwszy wiersz pokaże kod 301, a po kliknięciu w niego zobaczysz adres docelowy w nagłówku odpowiedzi location. Przeglądarka może zapamiętać odpowiedź 301, więc po zmianie reguły testuj w oknie prywatnym.

Po wdrożeniu sprawdź adres docelowy w narzędziu do sprawdzania adresów URL w Search Console. Stare adresy pojawią się w raporcie ze statusem „Strona zawierająca przekierowanie”, i jest to normalne.

Najczęstsze błędy

  • 302 zostawione na lata. Przekierowanie ustawione „na chwilę” przy migracji zostaje na stałe, a Google może dalej pokazywać stary adres. Jedna z przyczyn to Redirect bez kodu w Apache albo return bez kodu w nginx, bo oba dają wtedy 302.
  • Łańcuchy. A kieruje na B, B na C. Ustaw z A od razu na C. Roboty Google śledzą domyślnie do 10 kroków, ale Google zaleca łańcuch najlepiej do 3 kroków i poniżej 5.
  • Pętle. A kieruje na B, a B z powrotem na A, więc strona nigdy się nie otwiera. Przyczyną bywają dwie reguły w różnych miejscach, na przykład serwer kieruje na www, a Cloudflare z powrotem na wersję bez www. Szczegóły w tekście o pętli przekierowań.
  • Wszystko na stronę główną. Google pisze, że takie przekierowanie może zostać potraktowane jak pozorny błąd 404. Kieruj na najbliższy odpowiednik.
  • Linki wewnętrzne do starych adresów. Menu i treść dalej prowadzą przez przekierowanie. Google zaleca je poprawić na nowe adresy.
  • Za wczesne usunięcie. Google zaleca trzymać przekierowania po migracji zwykle co najmniej rok, a najlepiej dłużej.

Przy kilku przekierowaniach poradzisz sobie sam. Przy migracji z setkami adresów warto oddać mapę przekierowań i testy komuś, kto robi to regularnie, bo błąd w jednej regule potrafi przestawić cały serwis.

Jak przeprowadzamy migrację

Kiedy potrzebny jest specjalista

Zmieniasz domenę, platformę albo strukturę adresów? Przygotujemy mapę przekierowań, przetestujemy ją przed startem i sprawdzimy, czy Google przenosi widoczność na nowe adresy.

Jak przeprowadzamy migrację

Chcesz zlecić całość? Co obejmuje audyt SEO i GEO

Najczęstsze pytania

Jak zrobić przekierowanie 301?

W Apache dopisz do pliku .htaccess regułę Redirect 301 ze starą ścieżką i nowym adresem. W nginx użyj return 301 z nowym adresem. W WordPressie skorzystaj z wtyczki do przekierowań albo panelu hostingu, a w Cloudflare z Redirect Rules. Potem sprawdź wynik poleceniem curl -I.

Czym różni się przekierowanie 301 od 302?

301 oznacza zmianę na stałe i Google pokazuje w wynikach nowy adres. 302 oznacza zmianę tymczasową i Google zwykle zostawia w wynikach stary adres. Przy trwałej zmianie używaj 301.

Czy przekierowanie 301 przenosi pozycje?

Google pisze, że przekierowania stałe nie powodują utraty PageRanku, czyli wartości z linków. Nowy adres jest oceniany jak każda strona, więc pozycje zależą też od treści pod nowym adresem i od tego, czy odpowiada staremu.

Jak zrobić przekierowanie domeny na inną domenę?

Każdy adres starej domeny kieruj kodem 301 na ten sam adres w nowej domenie. Nie kieruj wszystkiego na stronę główną. Potem zgłoś przeniesienie w narzędziu zmiany adresu w Search Console i trzymaj przekierowania co najmniej rok.

Jak długo trzymać przekierowania 301?

Google zaleca zwykle co najmniej rok, a z perspektywy użytkowników najlepiej bez końca, bo do starych adresów mogą prowadzić linki z innych stron.

Kiedy użyć 307 albo 308?

Dla Google 308 działa jak 301, a 307 jak 302. Różnica dotyczy przeglądarek: 307 i 308 nie zmieniają metody wysyłania formularza. Dla zwykłych podstron wystarczy 301.

Przeczytaj też

Źródła