Przekierowanie starych linków na nowe w WordPress

Kiedy zmieniamy strukturę linków lub zmieniamy naszą domenę na nową w WordPressie mamy problem ze starymi linkami, które najczęściej przekierowujemy na główną stronę. Takie podejście nie jest zbyt dobre najdelikatniej to ujmując. Wyszukiwarki nie lubią tego typu przekierowań a i użytkownicy, którzy napotkają linki na innych stronach np. na forach dyskusyjnych zamiast do interesującego artykułu zostaną przekierowani na stronę główną. Na pomoc przyjdzie nam moduł serwera Apache mod_rewrite.

Posłużę się moim przykładem w którym musiałem przekierowywać stare linki z subdomeny: macsurf.mor.pl na główną domenę mor.pl. Aby łatwo nie było, WP wykorzystywał plugin do subdomen ( WP Subdomains ).
Przekierowanie ze starego linku na nowy miało wyglądać następująco:

Przykład

A w zasadzie 3 przykłady składające się na reguły przekierowania a to wszystko zawarte w jednym pliku .htaccess. Rodzaje przekierowań, które zaimplementujemy w mod_rewrite:

#1 ) www.macsurf.mor.pl -> www.mor.pl
#2 ) usunieta.macsurf.mor.pl/jakis_wpis -> www.mor.pl/jakis_wpis
#3 ) subdomena.macsurf.mor.pl -> subdomena.mor.pl
  • Pierwszy przypadek to zwykłe przekierowanie starej domeny na nową.
  • Drugi musi znajdować się przed trzecim przypadkiem ! Dlatego, że trzeci jest bardziej ogólny i pasowałby też do drugiego. Tak więc tutaj przekierowanie ma miejsce, kiedy subdomena nie istnieje – czyli nie ma żadnego odwołania, ale sam wpis istnieje już pod zmienioną subdomeną ( np. zmieniliśmy kategorię dla danego wpisu ).
  • Trzecie przekierowanie bierze pod uwagę każdą subdomenę ( poza subdomenami z 2 przypadku ) i przekierowuje je na nową domenę z tą samą nazwą subdomeny. Tzn. na starej domenie jak i na nowej nazwa subdomeny jest taka sama !

Na starej stronie w głównym katalogu w pliku .htaccess, należy wprowadzić odpowiednie reguły mod_rewrite, tak jak to zostało zaprezentowane poniżej:

<IfModule mod_rewrite.c>
RewriteEngine On
# 1) Przekierowanie ze starej domeny na nową
RewriteCond %{HTTP_HOST} ^(www\.)?macsurf\.mor\.pl$ [NC]
RewriteRule ^.*$ https://www.mor.pl [R=301,L]
# 2) Przekierowanie stron z nieaktywnymi starymi subdomenami na nowa domene
RewriteCond %{HTTP_HOST} ^(simlock|ios|objective_c)\.macsurf\.mor\.pl$ [NC]
RewriteCond %{REQUEST_URI} /(.*) [NC]
RewriteRule ^.*$ https://www.mor.pl/%1 [R=301,L]
# 3) Przekierowanie pozostałych subdomen z *.macsurf.mor.pl na subdomeny w *.mor.pl
RewriteCond %{HTTP_HOST} ^(.*)\.macsurf\.mor\.pl(.*)$ [NC]
RewriteRule ^.*$ http://%1.mor.pl/%2 [R=301,L]
</IfModule>

Objaśnienia – mod_rewrite

Aby zrozumieć powyższy wpis trzeba co nieco wiedzieć na temat: mod_rewrite i wyrażeń regularnych – przynajmniej podstawy.
Kilka słów o regułkach mod_rewrite w powyższym przykładzie.

RewriteCond - jest to warunek, odpowiednik w programowaniu instrukcji if.
RewriteRule - ta reguła odpowiada za modyfikację adresu url

Co do RewriteCond warunek zostaje spełniony jeśli ciąg znaków po lewej stronie równy jest ciągowi po prawej. Po lewej najczęściej wpisujemy zmienne typu %{ZMIENNA} a po prawej odpowiednie wyrażenia regularne lub zwykły ciąg tekstowy.

Obie te reguły ( RewriteCond i RewriteRule ) przyjmują po 2 parametry wymagane i 3 parametr opcjonalny.
Dwa pierwsze parametry to ciągi znaków. Mogą to być specjalne znaczniki ( zmienne środowiskowe ). Znaczniki te pokazują najczęściej odpowiednie fragmenty adresu url:

%{HTTP_HOST} - nazwa hosta, np.: mor.pl
%{REQUEST_URI} - żądanie dla serwera, czyli to co znajduje się po nazwie hosta, np.: /jakis_katalog/plik.php

W nawiasach kwadratowych znajdują się tzw. flagi, które określają zachowanie naszych warunków i reguł. Zastosowane flagi:

[NC] - (nocase) nie bierze pod uwagę wielkości liter w przekazywanych ciągach znakowych
[L] - koniec przetwarzania reguły RewriteRule dla danego warunku RewriteCond. Czyli jeśli warunek RewriteCond będzie prawdziwy to poniższe reguły RewriteCond będą wykonywane aż do napotkania reguły z flagą [L]
[R=301] - typ przekierowania, czyli w naszym przypadku 301 "Permanet Redirect".

Flagi można grupować, rozdzielamy je przecinkami, np.: [R=301,L]

Przekierowanie 301 jest tak jak wspomniałem na wstępie bardzo ważne z punktu widzenia wyszukiwarek. Jeśli mamy dużo starych nieaktywnych linków i wszystkie są przekierowywane na główną stronę to z wiadomych względów nie będzie to optymalne rozwiązanie dla wyszukiwarek, które będą chciały zaineksować konkretną zawartość, która kryła się pod tymi linkami. Tak więc zarówno użytkownikowi jak i wyszukiwarce takie podejście się nie spodoba 🙂

Ojaśnienia – wyrażenia regularne (regex)

Zastosowane wyrażenia regularne:

^(www\.)?macsurf\.mor\.pl$

Wyrażenie z 1 sekcji pasuje zarówno do www.macsurf.mor.pl jak i do nazwy domeny bez „www”. Więc bez względu jak ktoś wpisze nazwę domeny, będzie pasowało to do naszego wzorca.

^(simlock|ios|objective_c)\.macsurf\.mor\.pl$

W tej sytuacji ( 2 sekcja ) do wzorca pasują wszystkie subdomeny, które są pomiędzy pionową kreską „|”
Nazwy tych subdomen w kontekście przykładu musiała zostać wyszczególniona na „sztywno”, gdyż dotyczy to sytuacji kiedy subdomeny NIE ISTNIEJĄ !!! Usuneliśmy jest z WordPressa. W związku z tym jeśli nie ma już tych subdomen, musimy z tego typu subdomen przekierować użytkownika na adres bez subdomeny:
https://www.mor.pl/nasz_wpis/. Jeśli chcesz przekierowania na stronę typu http://nowa_subdomena.mor.pl/nasz_wpis/ to niestety trzeba w takiej sytuacji napisać odpowiedni kod PHP, który pobierze nazwę kategorii z bazy danej WP sprawdzając nazwe wpisu.

^(.*)\.macsurf\.mor\.pl(.*)$

W 3 sekcji sprawa jest już prosta, wzorzec pasuje do wszystkich stron, które mają jakąkolwiek subdomenę i jakiekolwiek „rządanie” – w naszym przypadku nazwa „wpisu” dla WP.
Zastosowanie reguły wieloznaczności .* w okrągłych nawiasach daje nam możliwość pobrania całej zawartości z nawiasu. Odczytać to możemy poprzez zmienne typu $1, $2, itd., gdzie liczba określa z którego nawiasu chcemy pobrać ciąg znaków.

Dla opornych

W krótce… 🙂

Opis Dalej
Cos Takie

Dodaj komentarz