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 |