Spis treści
O co chodzi i kiedy to ma sens
Wielu administratorów chce wymusić przekierowanie 404 na stronę główną w WordPress przez .htaccess, aby użytkownik nie widział błędu 404 po wejściu na nieistniejący adres. Taki zabieg poprawia doświadczenie części odwiedzających, ale ma wpływ na SEO. Zanim wdrożysz rozwiązanie, poznaj zalecane reguły i sposób wstawienia ich w odpowiednim miejscu pliku.
Wymagania i kopia zapasowa
Aby reguły działały, serwer musi używać Apache z włączonym modułem mod_rewrite oraz mieć AllowOverride ustawione tak, by .htaccess był respektowany. Zanim rozpoczniesz, pobierz kopię pliku .htaccess z katalogu głównego WordPress i zapisz ją lokalnie. Pozwoli to szybko wrócić do poprzedniego stanu, jeśli coś pójdzie nie tak.
Gdzie wstawić reguły w .htaccess
WordPress tworzy i utrzymuje własny blok między # BEGIN WordPress i # END WordPress. Twoje reguły przekierowań 404 umieść nad tym blokiem. Dzięki temu wykonają się wcześniej i nie zostaną nadpisane przez aktualizacje lub zmiany struktury odnośników.
# Twoje reguły przekierowań - wstaw tutaj
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Najprostsze przekierowanie 404 na stronę główną
Jeśli chcesz, aby każdy nieistniejący adres kierował na stronę główną serwisu, dodaj poniższe reguły nad blokiem WordPress. Zapewniają one, że prawdziwe pliki i katalogi nie są przekierowywane.
<IfModule mod_rewrite.c>
RewriteEngine On
# Nie przekierowuj strony głównej
RewriteCond %{REQUEST_URI} !^/$
# Przekieruj tylko wtedy, gdy nie istnieje plik ani katalog
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Przekieruj na stronę główną
RewriteRule ^.*$ / [R=301,L]
</IfModule>
Działanie: każdy nieistniejący adres otrzyma 301 i trafi na stronę główną. To rozwiązanie jest proste i skuteczne, ale może być zbyt agresywne w instalacjach z dodatkowymi punktami wejścia.
Wersja z wyjątkami, aby uniknąć pętli i problemów
W praktyce dobrze jest wykluczyć logowanie, panel, API, mapy witryny i kanały RSS. Dzięki temu unikniesz pętli przekierowań i przypadkowego blokowania ważnych ścieżek.
<IfModule mod_rewrite.c>
RewriteEngine On
# Nigdy nie przekierowuj strony głównej
RewriteCond %{REQUEST_URI} !^/$
# Wyklucz panel i logowanie
RewriteCond %{REQUEST_URI} !^/wp-admin
RewriteCond %{REQUEST_URI} !^/wp-login\.php
# Wyklucz REST API i kanały
RewriteCond %{REQUEST_URI} !^/wp-json
RewriteCond %{REQUEST_URI} !/feed/?$
# Wyklucz mapy witryny i popularne pliki serwisowe
RewriteCond %{REQUEST_URI} !sitemap\.xml$
RewriteCond %{REQUEST_URI} !robots\.txt$
# Przekieruj tylko gdy nie istnieje plik ani katalog
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 301 na stronę główną
RewriteRule ^.+$ / [R=301,L]
</IfModule>
Zachowanie parametrów w adresie URL
Przy przekierowaniu 301 Apache domyślnie zachowuje query string. Jeśli chcesz mieć pewność, że parametry zostaną dołączone nawet przy własnych docelowych parametrach, możesz dodać flagę QSA. W podstawowym scenariuszu nie jest to potrzebne, ale pełniejsza forma wygląda tak:
RewriteRule ^.+$ / [R=301,L,QSA]301 czy 302 – które przekierowanie wybrać
301 to przekierowanie trwałe i jest właściwym wyborem, jeśli decyzja jest docelowa. Przeglądarki i wyszukiwarki mogą je pamiętać.
302 to przekierowanie tymczasowe. Przydaje się do testów lub krótkich kampanii, ponieważ nie utrwala zmiany w indeksie wyszukiwarek.
Na start użyj 302 do sprawdzenia działania, a po weryfikacji zmień na 301.
Alternatywa: ErrorDocument 404 bez przekierowania
Możesz też podmienić samą stronę 404 na zawartość strony głównej, bez 301. Wtedy użytkownik zobaczy homepage, ale status HTTP pozostanie 404. Rozwiązanie jest mniej inwazyjne SEO, choć nie zmienia adresu w pasku. Wstaw jedną linię nad blokiem WordPress:
ErrorDocument 404 /To szybka metoda, gdy chcesz wyświadczyć przysługę użytkownikom, a jednocześnie zachować semantykę błędu.
Jak przetestować wdrożenie
Wyczyść cache przeglądarki i wtyczek cache. Przekierowania 301 są agresywnie buforowane.
Wejdź na losowy, nieistniejący adres, np. /to-nie-istnieje-abc. Powinieneś zostać przeniesiony na stronę główną.
Sprawdź nagłówki HTTP w narzędziach deweloperskich przeglądarki lub poleceniem:
curl -I https://twojadomena.pl/to-nie-istnieje-abcOczekiwany status to 301 lub 302, a nagłówek Location powinien wskazywać na adres główny.
Upewnij się, że logowanie, panel, kanały RSS, sitemap i REST API nie są przekierowywane.
Najczęstsze problemy i ich rozwiązania
Pętla przekierowań – dodaj wykluczenia dla strony głównej, panelu, logowania, API i sitemap jak w przykładzie z wyjątkami.
Reguły nie działają – sprawdź, czy mod_rewrite jest aktywny i czy .htaccess jest czytany. W razie wątpliwości umieść celowo błędną dyrektywę, aby upewnić się, że serwer reaguje, potem ją usuń.
Konflikty z wtyczkami cache lub bezpieczeństwa – część wtyczek dopisuje własne reguły. Utrzymuj swoje reguły nad blokiem WordPress i nad blokami wtyczek.
Multisite – w sieci witryn część ścieżek jest rezerwowana. Zachowaj dodatkową ostrożność przy wyjątkach i przetestuj na podwitrynach.
HTTPS i www – jeśli masz osobne przekierowania do https lub na preferowaną wersję domeny, umieść je nad resztą i przetestuj łańcuch przekierowań, aby uniknąć nadmiarowych skoków.
Uwaga SEO i dobra praktyka
Masowe przekierowanie 404 na stronę główną bywa niezalecane z perspektywy SEO, ponieważ uniemożliwia wyszukiwarce rozróżnienie między usuniętą a przeniesioną treścią. Lepsze w długim terminie jest mapowanie starych adresów na najbardziej zbliżone nowe podstrony lub zwracanie 410 dla trwale usuniętych zasobów. Jeśli jednak Twoim celem jest proste prowadzenie użytkowników na stronę główną, pokazane reguły działają skutecznie i bezobsługowo.
Szybkie podsumowanie wdrożenia
Dodaj reguły nad blokiem WordPress.
Zacznij od wersji z wyjątkami.
Przetestuj je jako 302, potem zmień na 301.
Monitoruj logi i narzędzia analityczne, aby wykryć niepożądane przekierowania.
