Jak zrobić przekierowanie 301 w .htaccess z jednego adresu na drugi?
Jeżeli podstrona na stałe zmieniła adres, ustaw przekierowanie 301 ze starego URL-a bezpośrednio na jego nowy odpowiednik. Na serwerze Apache lub LiteSpeed możesz zrobić to w .htaccess za pomocą RedirectMatch albo RewriteRule.
Krótka odpowiedź: aby przekierować wyłącznie
/stara-oferta/na/nowa-oferta/, dodaj przed regułami WordPressa:
RedirectMatch 301 "^/stara-oferta/?$" "https://example.pl/nowa-oferta/"
Zmień example.pl oraz obie ścieżki na właściwe. Zanim zapiszesz plik, pobierz jego kopię. Po zmianie sprawdź odpowiedź poleceniem curl -I.
Kiedy użyć przekierowania 301?
301 oznacza, że zasób został trwale przeniesiony pod inny adres. Jest właściwy, gdy:
- zmienił się slug podstrony lub artykułu;
- dwie podobne treści zostały połączone pod jednym URL-em;
- usługa ma nową podstronę, która zastępuje poprzednią;
- po przebudowie stary adres ma dokładny nowy odpowiednik;
- poprawiasz literówkę w adresie i stary URL nie powinien już wrócić.
Nie używaj 301, jeśli zmiana jest przejściowa. Nie kieruj też każdej usuniętej podstrony na stronę główną. Użytkownik powinien trafić do treści odpowiadającej temu, czego szukał. Jeśli odpowiednika nie ma, błąd 404 albo odpowiedź 410 może lepiej opisywać sytuację.
Wariant 1: dokładne przekierowanie przez RedirectMatch
RedirectMatch 301 "^/stara-oferta/?$" "https://example.pl/nowa-oferta/"
Co oznaczają elementy:
RedirectMatchpozwala dopasować ścieżkę wyrażeniem regularnym;301określa trwały kod odpowiedzi;^oznacza początek ścieżki;/stara-oferta/to stary URL bez domeny;?po ostatnim ukośniku sprawia, że ukośnik jest opcjonalny;$oznacza koniec ścieżki;- ostatni argument to pełny adres docelowy.
Dzięki kotwicom ^ i $ reguła nie obejmie przypadkiem /stara-oferta/dodatkowa-strona/.
Można spotkać prostszą dyrektywę:
Redirect 301 /stara-oferta/ https://example.pl/nowa-oferta/
Redirect dopasowuje prefiks. Jeżeli po źródłowej ścieżce pojawi się dalsza część, Apache może dołączyć ją do celu. To wygodne przy przenoszeniu całego katalogu, ale przy wymaganiu „tylko jeden URL” precyzyjniejszy jest RedirectMatch.
Wariant 2: dokładne przekierowanie przez RewriteRule
Jeżeli plik korzysta już z mod_rewrite albo przekierowanie będzie później wymagać warunków, użyj:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^stara-oferta/?$ /nowa-oferta/ [R=301,L]
</IfModule>
W .htaccess wzorzec RewriteRule w katalogu głównym nie zaczyna się od ukośnika. To częsta przyczyna niedziałających reguł.
Flaga [R=301,L] mówi: zwróć przekierowanie 301 i po dopasowaniu nie przetwarzaj dalszych reguł w tej rundzie.
W tym przykładzie cel jest ścieżką względną wobec tej samej domeny. Jeśli przenosisz stronę do innej domeny, wpisz pełny adres HTTPS.
Który wariant wybrać?
| Sytuacja | Zalecany wariant |
|---|---|
| Jeden adres → jeden nowy adres | RedirectMatch 301 |
Plik używa wyłącznie reguł mod_rewrite |
RewriteRule |
| Przekierowanie wymaga sprawdzenia domeny, protokołu lub innego warunku | RewriteCond + RewriteRule |
| Przenosisz cały katalog z zachowaniem dalszej ścieżki | Redirect albo osobna reguła wzorcowa |
Apache zaleca użycie prostszych dyrektyw mod_alias, gdy nie potrzebujesz złożoności mod_rewrite. Najważniejsza jest jednak spójność: nie twórz dla tego samego adresu dwóch konkurujących reguł w różnych modułach, wtyczce i panelu hostingu.
Gdzie wkleić regułę w WordPressie?
Dodaj własne przekierowanie przed blokiem # BEGIN WordPress:
# Własne przekierowania
RedirectMatch 301 "^/stara-oferta/?$" "https://example.pl/nowa-oferta/"
# BEGIN WordPress
# zawartość zarządzana przez WordPress
# END WordPress
Nie wklejaj ręcznej reguły pomiędzy znacznikami WordPressa. System może przebudować ten fragment po zapisaniu ustawień bezpośrednich odnośników i usunąć zmianę.
Jeżeli używasz RewriteRule, również umieść ją przed ogólną regułą kierującą żądania do index.php. Szczegółowe przekierowanie powinno zostać sprawdzone przed front controllerem WordPressa.
Czy zachowają się parametry adresu?
Przy zwykłym przekierowaniu RewriteRule, gdy cel nie zawiera własnego znaku ?, istniejący query string jest domyślnie przenoszony. Przykład:
/stara-oferta/?utm_source=newsletter
może przejść na:
/nowa-oferta/?utm_source=newsletter
Nie dodawaj flagi [QSA] bez potrzeby. Służy ona do połączenia starego query stringa z parametrami dodanymi w adresie docelowym. Jeżeli chcesz parametry świadomie usunąć, w Apache 2.4 można użyć [QSD], ale najpierw sprawdź, czy parametr nie steruje ważną funkcją, językiem, filtrem albo analityką.
Jak sprawdzić wynik?
W terminalu uruchom:
curl -I https://example.pl/stara-oferta/
Oczekujesz odpowiedzi podobnej do:
HTTP/2 301
location: https://example.pl/nowa-oferta/
Następnie sprawdź cały łańcuch:
curl -IL https://example.pl/stara-oferta/
Prawidłowy, prosty wynik:
- stary URL zwraca 301;
- wskazany adres docelowy zwraca 200.
Jeżeli po drodze występują kolejne przekierowania — na HTTPS, do innej wersji www, do adresu z ukośnikiem — ustaw od razu ostateczny URL w regule. Każdy dodatkowy krok zwiększa opóźnienie i utrudnia diagnostykę.
Sprawdź także:
- źródło z ukośnikiem i bez;
- czy podobny, ale inny adres nie został objęty regułą;
- czy strona docelowa istnieje;
- czy formularz albo parametr nie zmienia zachowania;
- czy wtyczka przekierowań nie ma drugiej reguły dla tego URL-a.
Najczęstsze błędy
RewriteRule zaczyna się od /
W kontekście .htaccess Apache usuwa prefiks katalogu przed dopasowaniem. Dlatego najczęściej używasz ^stara-oferta, a nie ^/stara-oferta.
Brak dokładnego końca wzorca
Bez $ reguła może dopasować także dłuższe ścieżki. Dla jednego adresu stosuj początek i koniec dopasowania.
Cel prowadzi do kolejnego przekierowania
Wpisz od razu HTTPS i wybrany wariant domeny. Nie kieruj do wersji, o której wiesz, że zostanie zmieniona przez inną regułę.
Błąd 500 po zapisaniu
Przywróć kopię .htaccess. Potem sprawdź log błędów serwera i składnię. Nie odświeżaj strony wielokrotnie z nadzieją, że konfiguracja „zaskoczy”.
Przeglądarka pamięta stary 301
301 bywa zapamiętywany. Testuj nagłówki przez curl, w prywatnym oknie i po wyczyszczeniu odpowiedniej warstwy cache. Nie polegaj tylko na pasku adresu.
Co zrobić po przekierowaniu?
301 jest zabezpieczeniem dla starych linków, a nie zamiennikiem porządku na stronie. Po zmianie:
- popraw wszystkie linki wewnętrzne na nowy URL;
- usuń stary adres z mapy XML;
- ustaw canonical na nowym adresie do niego samego;
- zaktualizuj menu, breadcrumbs i dane strukturalne;
- sprawdź, czy ważne linki zewnętrzne da się zmienić u źródła;
- monitoruj błędy 404 oraz wyświetlenia obu URL-i w Search Console.
Podsumowanie
Dla dokładnego przekierowania jednego URL-a użyj precyzyjnego RedirectMatch 301 albo RewriteRule z kotwicami początku i końca. Umieść regułę przed blokiem WordPressa, wykonaj kopię pliku i sprawdź cały łańcuch przez curl -IL. Przekierowanie powinno prowadzić jednym krokiem do istniejącej strony zwracającej 200.
Więcej scenariuszy — HTTPS, www, całe katalogi i zmiana domeny — znajdziesz w pełnym przewodniku po przekierowaniach w .htaccess.
Jeśli zmieniasz dziesiątki adresów albo nie masz dostępu awaryjnego do plików, skorzystaj ze wsparcia technicznego zamiast wdrażać reguły bez mapy i testu.