Uniwersalne przekierowanie 301

30 stycznia 2009

Na temat przekierowań 301 napisałem już sporo (tu i tu) ale tym razem mam coś bardzo smakowitego ;)

Przekierowania 301 najczęściej używa się gdy chcemy aby nasza strona zawsze pojawiała się z lub bez "www". Oczywiście podawałem już rozwiązania tego problemu w .htaccess (patrz linki wyżej) ale miały one jedną wadę: trzeba było wpisać adres swojej witryny. A może da się prościej?

Owszem, da się, chociaż ja nie znalazłem rozwiązania w google. W internecie jest mnóstwo identycznych informacji opisujących standardowe przekierowania ale nikt nie pokusił się o stworzenie jednego uniwersalnego.

Oto one:

Przekierowanie z "bez www" na "z www":

CODE:
  1. RewriteEngine On
  2. RewriteCond %{HTTP_HOST} !^www\. [NC]
  3. RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Przekierowanie z "www" na "bez www":

CODE:
  1. RewriteEngine On
  2. RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  3. RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

I już :) Nie trzeba więcej się martwić o wpisywanie całego adresu do regułki za każdym razem gdy robimy przekierowanie. Wszystkie przekierowania załatwisz teraz prostą metodą kopiuj wklej i nie musisz mnożyć regułek jeżeli do jednego serwera kieruje kilka domen.

EDIT
Właśnie znalazłem na drupal.org dyskusję na temat uniwersalnego przekierowania. Odzyskuję wiarę w internet hehe ;) Ich rozwiązanie jest prawie identyczne z moim. Jest jedna nic nieznacząca różnica w pierwszym przekierowaniu. Ale jeżeli miałbym się czepiać to uważam, że moje jest lepsze :D

 Dodaj komentarz

46 odpowiedzi dla tego wpisu

  1. Anmato napisał:

    Jesteś specem od 301 hehe

  2. Anmato napisał:

    I teraz poprosimy o ten kod w PHP

  3. MariuszT napisał:

    Pisane z głowy ale powinno być ok :)

    < ?php
    if(substr($_SERVER['HTTP_HOST'], 0, 3) != 'www') {
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: http://www.„. $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
    header(„Connection: close”);
    exit;
    }
    ?>

  4. Jacek napisał:

    DZięki przed chwilą wstawiłem przekierowanie na mojej www! Pozdawiam

  5. karpiu napisał:

    Witam.

    Ja mam pytanie związane z tematem.
    Przekierowania działa mi poprawnie po za kilkoma wyjątkami.
    Są to przekierowania dla wyświetlanych zdjęć. (adres zdjęcia jest przekazywany do PHP, jest tam ono podpisywane i dopiera wtedy wyświetlane) W treści strony pojawiają się adresy do zdjęć które maja zostać przetłumaczone i podmienione przez rewriterule. I kicha, w logu widzę informacje o podmianie treści przekierowania, poprawny wynik przekierowania który po wpisaniu w przeglądarce daje pożądany wynik.
    Niestety na docelowej stronie gdzie powinny się wyświetlić zdjęcia, nic się nie dzieje. Wygląda to tak jak sam apache nie pozwalał na podmianę adresów w treści strony. Tłumaczone są tylko te adresy które docelowo maja się wyświetlić w polu adresu przeglądarki.
    Ma ktoś może jakiś pomysł co może odpowiadać za taka sytuacje ?

  6. MariuszT napisał:

    Trudno powiedzieć, nie wszystko zrozumiałem. Może zdjęcia ładują Ci się z cache przeglądarki? Prześledź snifferem wszystkie nagłówki i kolejne przekierowania. Polecam do tego celu użyć Firebug’a, który ma wbudowanego przyjemnego snifferka śledzącego tylko to co się dzieje w przeglądarce.

    A tak w ogóle to mam nadzieję, że nie „podpisujesz” (cokolwiek to znaczy) zdjęć za każdym razem gdy je wywołujesz?

  7. virusxd napisał:

    Ja wole moje przekierowanie za pomocą CNAME, bez plików, bez zbędnego pisania i zawsze działa :)
    Po prostu zamiast wpisać ścieżkę do katalogu ze stroną wpisałem drugi adres z www.

  8. MariuszT napisał:

    Nie każdy ma takie możliwości.

  9. Luzak napisał:

    Dzięki za info.
    Mam jeszcze pytanie odnośnie przekierowania ze strony głównej/index.php na stronę główną. Chcę uniknąć indeksowania dwóch stron i nie wiem co wstawić w .htaccess.

    Będę wdzięczny za pomoc.

    Pozdrawiam

  10. Luzak napisał:

    Mam małe pytanko. Szukam rozwiązania dla problemu przekierowania ze starego sklepu na nowy sklep. Oba sklepy pod oscommerce. Stary sklep na subdomenie a nowy na domenie głównej. Stary sklep mocno rozpowszechniony w sieci. Myślę o przekierowaniu 301 ale nie wiem jak skonstruować takie przekierowanie. Niestety w sklepie zmieniły się nietylko domeny ale również nazwy produktów.
    Oto przykład:
    Stary sklep
    http://www.sklep.domena.pl/blender-sb4-p-1811.html
    Nowy sklep
    http://www.domena.pl/blender-sb4-p-84.html

    Czy można stworzyć jakiś „myk”, który będzie szukał po podobnych nazwach?

    Będę wdzięczny za pomoc.

  11. MariuszT napisał:

    Hej Luzak :)

    Odpowiedź na pytanie numer 1:

    RewriteEngine On
    RewriteRule ^index.php$ / [R=301,L]

    To tak na szybko napisane, nie testowałem ale powinno działać :) Gdyby jednak coś było nie tak to pisz, potestuję :)

    Odpowiedź na pytanie numer 2:

    Przekierowanie z subdomeny na nową domenę zrobisz bez problemu (zalecam lekturę moich wpisów na tym blogu o 301 i powinieneś dać sobie spokojnie radę :) ).

    Co do produktów to obawiam się, że .htaccess Ci tu nie pomoże. Jeżeli nazwy/numery ID produktów się zmieniły to jedyny sensowny sposób to zabawa z PHP. Czyli zapominasz całkowicie o .htaccess i przy uruchomieniu strony w PHP sprawdzasz czy istnieje dany produkt. Jeżeli nie istnieje to go szukasz i jak znajdziesz to robisz przekierowanie. Dla optymalizacji najlepiej zrobić osobną tabelę gdzie będą zapisane informacje o produktach, ich stary i nowy adres. W ten sposób łatwiejsze będzie wyszukiwanie, oszczędniejsze niż szukanie na ślepo po całej tabeli z produktami. Niestety prościej się nie da i gotowej regułki nie mogę Ci podać.

  12. Luzak napisał:

    Witaj. Dzięki za pomoc. Mam jeszcze jedno pytanie. Próbuje wrzuciś do .htaccess ręczne przekierowanie 301 na nowy adres przynajmniej dla najważnieszych stron dla których zmieniła się nie tylko domena ale i link. Jednak opierając się na kodzie

    RewriteRule ^kanaly-rss/?$ /kanaly-informacyjne/ [R=301,L]

    pozwala zrobić mi to tylko dla jednego adresu. Gdy wpisuję drugą taką samą linię dla innego linku strona mi sie wywala. Jak to zrobić i czy wogóle jest to możliwe?

    Pozdrawiam
    Luzak

  13. MariuszT napisał:

    „Gdy wpisuję drugą taką samą linię dla innego linku” – wytłumacz dokładniej co robisz.

    Pamiętaj, że możesz używać wyrażeń regularnych i załatwić jedną linijką przekierowanie wielu stron o ile do wszystkich da się zastosować pojedynczą regułę.

  14. Luzak napisał:

    Już rozwiązałem ten problem – miałem błąd i stąd to zamieszanie.

    Zasadniczo mam do Ciebie jeszcze jedno pytanie.

    Pisałeś coś takiego:
    „Co do produktów to obawiam się, że .htaccess Ci tu nie pomoże. Jeżeli nazwy/numery ID produktów się zmieniły to jedyny sensowny sposób to zabawa z PHP. Czyli zapominasz całkowicie o .htaccess i przy uruchomieniu strony w PHP sprawdzasz czy istnieje dany produkt. Jeżeli nie istnieje to go szukasz i jak znajdziesz to robisz przekierowanie. Dla optymalizacji najlepiej zrobić osobną tabelę gdzie będą zapisane informacje o produktach, ich stary i nowy adres. ”

    Gdzie znajdę informacje na ten temat jak zrobić taką tabelę. Ten temat jest dla mnie całkowitą nowością.

    Będę wdzięczny za pomoc.

    Pzdr. Luzak

  15. MariuszT napisał:

    Przykro mi, chciałbym Ci pomóc ale obawiam się, że nie poradzisz sobie bez wiedzy programistycznej. U Ciebie trzeba zobaczyć jak ta strona jest zbudowana i na podstawie tej wiedzy przygotować rozwiązanie. Musi to zrobić programista. Co więcej, nie da się tego zrobić nie mając dostępu do Twojego serwera, kodu strony, bazy danych.

  16. Luzak napisał:

    ok, dzięki za pomoc.

    Pzdr.
    Luzak

  17. wolvverine napisał:

    dodanie R=301 do takiego przekierowania z kolei wywali serwer:
    RewriteRule ^mapa_strony$ index.php?id=site_map [NC,L]

  18. MariuszT napisał:

    Nie wiem czemu to generuje błąd. Tak na oko to nie powinno, najprostsze z możliwych przekierowań. Nie sprawdzałem u siebie.

  19. Helper napisał:

    Hej,

    Mam trochę inny problem, acz też związany z htaccess dlatego koment w tym poście. Chciałbym zrobić przekierowanie wszystkich podstron – konkretnie chodzi o to, że obecnie podstrony dublują się i występują w takich wersjach:

    1. http://www.przyklad.pl/plik.ph.....amp;cat=20

    2. http://www.przyklad.pl/oto,ta,strona,11111,20.html

    Chciałbym, żeby z jednej automatycznie przekierowywało na drugą, ale żeby załatwić to dla wszystkich podstron (analogicznie zmienia się tylko id i cat) za jednym razem.

    Jest taka możliwość?

  20. MariuszT napisał:

    Zobacz piąte okienko z kodem na tej stronie http://www.tarnaski.eu/blog/przekierowanie-301/

    Użyj wyrażeń regularnych w .htaccess. Niestety jeżeli w nowych adresach używasz np. tytułu artykułu to .htaccess będzie bezradny, nie będzie potrafił pobrać tego tytułu bo w starym linku nie było go w adresie. Wtedy pozostaje Ci jedynie przekierowanie w PHP.

  21. q67 napisał:

    witam
    Problem brzmi:przedtem google pozycjonowało mnie po adresie domeny, zmieniłem serwer na darmowy i teraz google indexuje mnie po adresie darmowego serwera. Co z tym poradzić ,czy przekierowanie 301 coś może pomóc ?

  22. MariuszT napisał:

    Tak, zrób przekierowanie na starym serwerze na nowy adres.

  23. q67 napisał:

    tylko,że stary serwer jest juz nieaktywny.

  24. MariuszT napisał:

    Musisz mieć dostęp do starej domeny (folderu na który ta stara domena wskazuje) aby zrobić przekierowanie na nowy adres.

  25. q67 napisał:

    Chyba niezrozumiałeś… Domena jest ciągle ta sama tylko serwer gdzie trzymam pliki zmieniłem . i google teraz źle pozycjonuje moją strone(miejsce te same tylko pod adresem nowego serwera).

  26. MariuszT napisał:

    Napisałeś o nowym adresie więc myślałem, że go zmieniłeś na stałe, pozbyłeś się domeny. Jeżeli nie chcesz aby google Cię indeksowało po nowym adresie to zrób przekierowanie z tego błędnego adresu na ten dobry.

  27. q67 napisał:

    teraz jeszcze problem bo niemoge utworzyc na serwerze takiego pliku. A serwer też nie obsługuje php. Jakas inna możliwośc ?

  28. MariuszT napisał:

    Możliwe, że w Twoim panelu zarządzania serwerem możesz przekierować domenę na tą która Cię interesuje. Jeżeli nie i nie działa Ci PHP ani inny język server side i nie możesz utworzyć pliku .htaccess lub serwer nie potrafi go obsłużyć to (pomijając metody do których na pewno nie masz dostępu) nie przychodzi mi żadne rozwiązanie do głowy.

  29. MŁK napisał:

    Witam,
    przekierowanie na „bez www” bardzo mi się przydało,
    jednak mam pytanie.
    Mam trzy domeny: domena.pl, domena.eu i domena.cba.pl
    Wszystkie są skierowane na ten sam serwer.
    Czy istnieje możliwość takiej konfiguracji pliku .htaccess, aby wszystkie kierowały na domenę .pl lub .eu (mimo że ta sama strona jest na jednym serwerze)?

  30. MŁK napisał:

    Jeszcze raz: Nie zauważyłem innego artykułu na ten temat. Pomogły mi oba i to bardzo. Oby tak dalej :-)

  31. MariuszT napisał:

    Czyli mam rozumieć, że już sobie poradziłeś? :)

  32. MŁK napisał:

    Tak, nie zauważyłem tego na początku artykułu „sporo (tu i tu)” i na linka nie kliknąłem. Pozdrawiam.

  33. Kojot napisał:

    Panowie, przymierzam się do nowej domeny i przekierowania 301. Wie ktoś może, jak sprawdzić, czy nowa domena „usamodzielniła” się już, ma własny PR i można na stałe zrezygnować ze starej (zawierającej przekierowanie) bez obawy że wszystko się sypnie?

  34. MariuszT napisał:

    Pisałem o tym już raz ale napiszę ponownie.

    Póki istnieje przekierowanie to siła PR, linków itd. jest przekazywana. Usuniesz przekierowanie (np. nie opłacając starej domeny) i wszystko zostanie utracone. Nie wiem czemu ludzie sądzą, że przekierowanie 301 jest jednorazowe i po jakimś czasie można je usunąć bez konsekwencji…

    PS
    Aby przekonać się czy przekierowanie już w pełni działa można sprawdzić site starej domeny lub np. sprawdzić czy nowa domena trafiła w serpach na pozycje starej. Nie ma jednak metody, która jasno odpowie: tak, Google już całkowicie wziął pod uwagę Twoje przekierowanie.

  35. Kojot napisał:

    Dzięki MariuszT. Wyciągam z tego wniosek, że aby móc zrezygnować ze starej domeny i jednocześnie zachować przekazany PR i pozycje nowej, trzeba, po przekierowaniu, sukcesywnie pozycjonować nową i przekazywać bezpośrednio jej linki, które prowadziły wcześniej do starej. I dużo cierpliwości. I jeśli za rok usunę przekierowanie, 100% pewności nadal miał nie będę, że przekazany PR zostanie. Skądinąd może być też wyższy, jeśli np. w międzyczasie zdobyłem dobre linki do nowej.

  36. MariuszT napisał:

    Zgadza się. Przekierowanie 301, chociaż działa i jest jedynym sensownym sposobem na zachowanie PR, pozycji itd. po zmianie adresu, to niestety nie jest super idealne. Przekierowanie musi być aktywne najdłużej jak się da aby był pożądany efekt.

  37. Marys napisał:

    Mam pytanie,

    Czy można przekierować ścieżkę do katalogu na konkretną domenę? Chodzi o to, że posiadając kilka domen, które są przypięte do głównego katalogu na serwerze można się trochę wkopać w niezłe problemy, np.
    Mam domenę pierwsza.pl, która jest przypięta do katalogu:
    nazwaserwera.pl/pierwsza
    Jeśli mamy jeszcze inne domeny podpięte pod katalog główny:
    druga.pl
    trzecia.pl
    to możemy uzyskać w wyszukiwarce groteskowy efekt:
    druga.pl/pierwsza
    trzecia.pl/pierwsza

    Jak bronić się przed podobnym przypadkiem?

  38. MariuszT napisał:

    Zmienić strukturę katalogów :P A tak na poważnie to wiem, że są dostawcy hostingu, którzy mają takie ustawienia i to nastręcza problemów.

    Można sobie z tym poradzić na dwa sposoby.

    Sposób 1
    W katalogu głównym umieścić .htaccess z regułami: jeżeli domena jest X (w Twoim przykładzie domeny druga.pl i trzecia.pl) i katalog jest Y (u Ciebie „pierwsza”) to przekieruj na domenę Z (u Ciebie pierwsza.pl)

    Sposób 2
    W katalogu podrzędnym (w Twoim przykładzie katalog „pierwsza”) umieścić .htaccess z regułą: jeżeli domena nie jest X (Twoje pierwsza.pl) to przekieruj na X (ponownie pierwsza.pl).

    W sposobie pierwszym można pominąć sprawdzanie domeny ale wtedy musisz się pogodzić z niemożliwością posiadania adresu pierwsza.pl/pierwsza.

    Pokombinuj, pomyśl, jak się nie uda to postaram się pomóc w stworzeniu konkretnego kodu.

  39. Michał napisał:

    Radzę przekierować wszystkie żądania na index.php ja tak robię i dopiero php zajmuje się dalszą obróbką danych. Dlaczego? Łatwiej przenieść skrypt na inny serwer, miałem już przeprawę z OVH, ponieważ tam PHP jest zainstalowane jako moduł CGI i nie można używać php_flag/php_value tylko SetEnv.

    W htaccess najlepiej zrobić to tak:

    RewriteCond %{HTTP_HOST} !^(www\.)domena.pl [NC]
    RewriteRule ^(.*)$ http://www.prawdziwadomena.pl [R=301,L]

    A w PHP tak:

    if( $_SERVER[ 'HTTP_HOST' ] !== ‘twoj_host’ )
    {
    header( ‘Location: http://www.prawdziwadomena.pl/‘ . $_SERVER[ 'REQUEST_URI' ] );
    }

    Pozdrawiam :)

  40. MariuszT napisał:

    1. Twój komentarz jest zupełnie nie na temat. Co to ma wspólnego z przekierowaniami 301?
    2. 301 najlepiej robić w .htaccess a nie w PHP bo nie uruchamiamy wtedy parsera
    3. To oczywiste, że przekierowanie wszystkiego na index.php to dobra praktyka ale zapytam jeszcze raz – jaki to ma związek z tematem wpisu??
    4. Piszesz o przekierowaniu na index.php natomiast podajesz kod do .htaccess na przekierowanie 301 i kod PHP na zwykłe przekierowanie (nawet nie 301)…

    WTF?!

  41. Kamil napisał:

    Ad. 4) Mariusz, a czy czasem „zwykłe przekierowanie” to nie właśnie 301? Wydaje mi się, że to dokładnie 301 :-)

  42. MariuszT napisał:

    Mylisz przekierowanie 301 z 302.

  43. Kamil napisał:

    Faktycznie, domyślnie jest 302. A żeby dać 301 to trzeba napisać:
    header(„Location: /foo.php”, true, 301);

    Teraz już wiem, dzięki. Po prostu myślałem, że standardowo daje 302 – nie doczytałem manuala w tej kwestii.

  44. Michał napisał:

    Chciałem podać ideę a nie gotowy kod. wystarczy dodać true i response code 301

    Pozdrawiam

  45. lamer okrutny napisał:

    Hej,

    A co wrzucić w .htaccess, żeby http://www.domena.pl było przekierowywane na domena.pl i dodatkowo nieistniejące już stronki typu http://www.domena.pl/nieaktualnastronka.html lub domena.pl/nieaktualnastronka.html przekierowywało na domena.pl? Z góry wielkie dzięki za pomoc – kombinowałem ale przerasta mnie to, ja humanista jestem ;)

  46. MariuszT napisał:

    Zastosuj przekierowanie „z www” na „bez www” a następnie zobacz jak odpowiedziałem na ten komentarz http://www.tarnaski.eu/blog/pr.....mment-3557

Odpowiedz



Podobne wpisy: