Przekierowanie 301 raz jeszcze

07 czerwca 2008

Dzisiaj ktoś prosił mnie o pomoc w związku z moim wpisem Przekierowanie 301. Postanowiłem więc uzupełnić informacje :) To będzie krótka notka :P

Może zdarzyć się, że mamy dwie domeny, obie kierują na tą samą stronę jednak nie chcemy aby strona była w dwóch kopiach pod dwoma adresami tylko żeby jeden adres przekierowywał na drugi. Oto gotowa reguła:

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

Powyższy kod umieszczony w pliku .htaccess przekieruje wszystko co jest pod domena1.pl na domena2.pl :) Bez względu na to czy dodamy przedrostek www.

Wersja dla PHP wygląda tak:

PHP:
  1. <?php
  2. if($_SERVER['HTTP_HOST']=='domena1.pl' || $_SERVER['HTTP_HOST']=='www.domena1.pl')
  3. {
  4. header("HTTP/1.1 301 Moved Permanently");
  5. header("Location: http://www.domena2.pl".$_SERVER['REQUEST_URI']);
  6. header("Connection: close");
  7. }
  8. ?>

Cała sprawa polega na tym, że trzeba sprawdzić jaka domena jest wywołana ponieważ obie domeny kierują na te same pliki. Gdybyśmy wsadzili zwykłe przekierowanie z poprzedniego wpisu na temat przekierowań 301 to po wejściu na domena2.pl przekierowywałoby nas na... domena2.pl :) Wszystko by się zapętliło i mielibyśmy błąd. Zresztą domena1.pl też by nie działała bo najpierw by nas przekierowało na domena2.pl a potem znowu zapętlenie.

Uwaga! (30.01.2008)
Jeżeli interesuje Cię przekierowanie w .htaccess z "bez www" na "z www" lub odwrotnie to nie pożałujesz jeżeli przeczytasz mój wpis na temat uniwersalnego przekierowania 301.

Dodaj komentarz

53 odpowiedzi dla tego wpisu

  1. MaQ napisał:

    Zawsze można domene umieścić na serwerach DNS i podpiąć do hostingu na którym jest strona ;)

  2. MariuszT napisał:

    Można można ale nie każdy daje radę ;) Ludzie się gubią z tymi DNS’ami, panelami itd. A tu prosta regułka i może jeszcze przy okazji ktoś się czegoś nowego nauczy przy pisaniu reguł w .htaccess.

  3. MaQ napisał:

    Właściwie to masz racje :) Ale nie ma to jak dobry hosting z zainstalowanym C-panel’em ;) Wszystko szybko łatwo etc.

  4. Anonim napisał:

    Ten powyższy kod php wklejamy do każdej strony czy tylko do index.php ?

  5. MariuszT napisał:

    Zależy jak masz zbudowaną stronę. Ogólnie zasada jest taka, że kod aby zadziałał musi być uruchomiony :P To chyba żadne odkrycie :) A więc jeżeli wkleisz to do index.php a ktoś wejdzie do Ciebie na jakąś podstronę gdzie plik index.php nie jest wywoływany to kod wtedy nie zadziała.

    Często strony są tak zbudowane, że gdzieś leży pliczek config.php, który dołączany jest do dowolnie wywołanej strony. Wtedy w nim wystarczy umieścić kod i przekierowanie zadziała wszędzie. Ale powtórzę: wszystko zależy od budowy Twojej strony.

  6. Anonim napisał:

    Ale w podstronie muszę umieścić w skrypcie 301, link do tej samej podstrony tak? Jeśli mam domenę nazwa.pl i chcę aby wszystkie strony wpisane i szukane z przedrostkiem www, były kierowane do promowanej strony bez www, to w każdej podstronie, w kodzie 301 muszę wpisać nie przekierowanie do nazwa.pl tylko do np. nazwa.pl/podstrona.php tak? Bo inaczej otwierając podstronę 301 przekieruje do głównej index.php ?

  7. Anonim napisał:

    Dodawanie 301 w PHP do każdej strony jest konieczne jeśli nie ma się.htaccess tak? Natomiast 301 w .htaccess przekierowuje wszystko co jest oparte na danej domenie? Dobrze rozumuję?:P

  8. MariuszT napisał:

    W pierwszym komentarzu rozumiem, że mówisz o przekierowaniu w PHP? Nie, nie musisz na każdej stronie bawić się w podawanie poprawnej ścieżki. Jest ona „doklejana” automatycznie. Czyli w powyższym kodzie zmieniasz tylko adresy domen i wstawiasz kod gdzie trzeba i działa. Powinno poprawnie przekierowywać wszystkie podstrony.

    W drugim komentarzu masz rację, jest właśnie tak jak myślisz.

  9. Anonim napisał:

    A jak zrobić przekierowanie 301 z adresu np
    (www.)serwer.pl/~uzytkownik/folder/
    na http://www.adres.pl ?

  10. MariuszT napisał:

    Wszystkie potrzebne informacje masz tutaj:

    http://www.tarnaski.eu/blog/przekierowanie-301/
    http://www.tarnaski.eu/blog/pr.....z-jeszcze/

  11. Anonim napisał:

    probowalem tak:

    i tak:
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(www\.)?serwer.pl/~uzytkownik/folder/(.*) [NC]
    RewriteRule ^(.*)$ http://www.adres.pl/$1 [R=301,L]

    i nie dziala

  12. MariuszT napisał:

    Tak na oko to powinno działać więc trudno powiedzieć co robisz źle. Jeżeli nic nie pomaga to wsadź do ~uzytkownik/folder/ .htaccess o takiej treści:

    RewriteEngine On
    RewriteRule ^(.*)$ http://www.adres.pl/$1 [R=301,L]

    Wtedy wszystko z tego folderu (i w tych „głębiej”) zostanie przekierowane na nowy adres.

  13. laudi napisał:

    Mam pytanie jak mogę sprawdzić czy to przekierowanie rzeczywiście przenosi „siłę” strony(czy czegoś źle nie wpisałem)
    Kod:
    RewriteCond %{HTTP_HOST} ^(www\.)?shinden-anime.info(.*) [NC]
    RewriteRule ^(.*)$ http://www.anime-shinden.info/$1 [R=301,L]

    jak widać samo przekierowanie z domeny na 2 działa, jednak w jaki sposób sprawdzić czy działa poprawnie?

  14. MariuszT napisał:

    @laudi, przeważnie jest tak, że albo przekierowanie działa poprawnie albo nie działa wcale ;) To Twoje działa tak jak należy. Jak to sprawdzić? Trzeba przeanalizować nagłówki HTTP. Można to zrobić na wiele sposobów.

    Jest sniffer, moim zdaniem najlepszy, Wireshark. Tylko to trochę jak z armatą na muchę bo program ma ogromne możliwości, których Ty nie potrzebujesz.

    Jest wtyczka do Firefox’a, która się nazywa „Live HTTP headers” (niedługo pojawi się na tej stronie mój wpis o wtyczkach i o niej również będzie info). Dzięki niej w łatwy sposób można sprawdzić jak wygląda komunikacja między przeglądarką a serwerem.

    Są również proste narzędzia online, chociażby takie: http://www.seologic.com/webmas.....direct.php

    Pełna nazwa przekierowania 301 brzmi „301 Moved Permanently” i tego powinieneś szukać w nagłówkach.

  15. domi napisał:

    Witam mam problem z przekierowaniem, zrobiłem dwa tygodnie temu przekierowanie z nfszone.eu na nfspolska.pl dzisiaj wpisując np w google frazę nfs shift pojawiają się moje dwie domeny nfszone.eu a na piątej stronie nfspolska.pl … Proszę o pomoc z tym fantem zrobić .

  16. MariuszT napisał:

    Nie pozostaje Ci nic więcej jak czekać. W sumie to w Twoim interesie jest żeby ta sama strona pojawiała się dwukrotnie w wynikach wyszukiwania ;) Więc ja bym nie narzekał. Google w końcu powinno się zorientować co jest grane i wyszukiwarka zareaguje prawidłowo.

  17. domi napisał:

    Dzisiaj mija 4 tydzień przekierowania pozycjonuje nfspolska.pl cały czas jest na 5-6 stronie w google , pod frazami jak wyżej podawałem , pozycja cały czas się utrzymuje na tych stronach lub nawet dalej, wcześniej na nfszone.eu byłem na pierwszych stronach, nie wiem dlaczego moją pozycja nie idzie wyżej, czy to jest normalne ?

  18. Lime napisał:

    Witam.
    Właśnie zmieniłem adres forum w moim serwisie z http://www.example.com/forum na http://www.forum.example.com jak teraz z robić, aby w pliku .htaccess przekieować z adresu http://www.example.com/forum na http://www.forum.example.com oraz z bez .www na z .www

  19. MariuszT napisał:

    Domi, faktycznie Twoja strona jest daleko a fraza „nfs shift” nie wygląda na trudną. Może popełniłeś jakiś błąd podczas pozycjonowania i to się zbiegło w czasie z przekierowaniem? Samo przekierowanie jest raczej dobrze ustawione, chwilowo mogłoby wywołać taki efekt ale to już trwa trochę za długo… Problem w takich sytuacjach jest taki, że ciężko jednoznacznie wywnioskować co jest przyczyną, zwłaszcza gdy nie wiem jak strona do tej pory była pozycjonowana. Postaraj się w najbliższym czasie zdobyć trochę wartościowych linków do nowego adresu na wyżej wymienioną frazę. Tylko też nie przesadzaj z tym…

    Lime, wystarczająco dużo już napisałem na temat przekierowań, wystarczy poczytać.

  20. Pinio napisał:

    Mam pytanie czy Twój skrypt sprawdza czy użytkownik/robot sprawdza czy jestesmy na tej starej czy nowej domenie i przekierowuje tylko wtedy gdy jestesmy na starej czy zawsze?

  21. MariuszT napisał:

    Wysyłasz komentarz z pytaniem o coś o czym właśnie traktuje powyższy tekst…

  22. Pinio napisał:

    Ok no juz rozumiem. Czy przekierowanie wykonane w php także przekierowuje nie tylko użytkoników ale także roboty wyszukiwarek i czy przenosi zatem całą moc pozycjonowanie jednej domeny na drugą?

    Pozdrawiam i dzięki za odpowiedź!

  23. MariuszT napisał:

    Odróżniaj server side od client side. Nieważne co przekierowuje (PHP, .htaccess czy cos tam jeszcze…), jeżeli przekierowanie ustawione jest po stronie serwera to dotyczy wszystkiego, ludzi, robotów itd. Zresztą znowu Ci się szukać/czytać nie chciało, w innym tekście o 301 jasno napisałem o co w tym wszystkim chodzi…

  24. luki napisał:

    Witam,
    mam małe pytanie związane z zamieszczonym kodem, a dokładniej:
    header(„Connection: close”);
    jaką rolę pełni powyższa linijka w kodzie php?

  25. MariuszT napisał:

    Zamyka połączenie HTTP. Czytałem na ten temat kilka sprzecznych ze sobą informacji. Jedni twierdzą, że to wymóg protokołu, inni, że bez tego IE potrafi się wykrzaczyć itp. Z drugiej strony podobno (nie sprawdzałem) użycie exit powoduje już wysłanie tego nagłówka.

    Tak czy owak warto to stosować jako ostatni nagłówek, tuż przed exit;, chociażby dla przejrzystości.

  26. luki napisał:

    Dziękuję za szybką pomoc, ja też ostatecznie po poszukiwaniach trafiłem na jakąś anglojęzyczną stronę (http://www.webmasterworld.com/forum88/3447.htm) gdzie wyszło na to że to wymóg protokołu

  27. Lechu5 napisał:

    Ok rozumiem że jeżeli posiadam dwie różne domeny które kierują na jedną domene to musimy się posłużyć poniższym schematem:

    RewriteCond %{HTTP_HOST} ^(www\.)?link1.pl(.*) [NC,OR]
    RewriteCond %{HTTP_HOST} ^(www\.)?link2.pl(.*) [NC]
    RewriteRule ^(.*)$ http://www.linkstart.pl/$1 [R=301,L]

    ale co jeśli mamy 4 różne domeny ?
    Jak to zrobić bo już nie mam sił…

  28. MariuszT napisał:

    RewriteCond %{HTTP_HOST} ^(www\.)?link1.pl(.*) [NC,OR]
    RewriteCond %{HTTP_HOST} ^(www\.)?link2.pl(.*) [NC,OR]
    RewriteCond %{HTTP_HOST} ^(www\.)?link3.pl(.*) [NC,OR]
    RewriteCond %{HTTP_HOST} ^(www\.)?link4.pl(.*) [NC]
    RewriteRule ^(.*)$ http://www.linkstart.pl/$1 [R=301,L]

    A teraz odpowiedz sobie czy to było naprawdę takie trudne do wymyślenia/wyszukania…

  29. Lechu5 napisał:

    OK dziekuje za pomoc, wiem ze dla Ciebie to pryszcz ale dla mnie to czarna magia. No faktycznie teraz wyglada banalnie proste

  30. Marenek napisał:

    Witaj. Twoje wpisy na blogu są po prostu świetne. Jednakże mam z tym przekierowaniem problem. Chodzi mi o to gdy chcę przekierować cały ruch z domena.pl/cokolwiek na domena.pl/index.php (lub po prostu na domena.pl) tworzy się jakiś błąd i nieskończona pętla. W .htaccess tworzę taki wpis:

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(www\.)?domena.pl(.*) [NC]
    RewriteRule ^(.*)$ http://www.domena.pl/index.php [R=301,L]

    to powstaję błąd i nieskończona pętla. Jak z tego wybrnąć?

  31. MariuszT napisał:

    Przekierowujesz wszystko na index.php. Problem w tym, że index.php też przekierowujesz na index.php :) Reguła się zapętla. Musisz z niej wykluczyć sytuację gdy wywoływany jest index.php. Oto Twoja praca domowa :)

  32. Paweł napisał:

    Korzystałem z uniwersalnego przekierowania w pliku .htaccess ze strony strona.pl
    na stronę o tym samym adresie ale z www.
    Niestety wpisując adres strona.pl nie jestem przekierowany na http://www.strona.pl.
    Dodam tylko, że korzystam z serwera w nazwa.pl

  33. MariuszT napisał:

    Nie wiem co odpisać, ten kod powinien działać, był testowany. Spróbuj spersonalizowane (nie uniwersalne) rozwiązanie.

  34. Maciek napisał:

    a jak ustawić przekierowanie adresu:
    http://www.mojadomena.pl/product.php?id_product=23

    tak aby zawsze wywoływany był adres
    http://www.mojadomena.pl/fajny-produkt.html

    możesz mi podpowiedzieć jak miałby wyglądać wpis?Walczę z tym ale jakoś mi niestety nie wychodzi.

  35. jaco napisał:

    na maxa laickie pytanie

    nazwa pliku ma byc

    .htaccess czy tez .htaccess.txt czyli tak jak zapisuje notatnik ?

  36. MariuszT napisał:

    A czy gdzieś napisałem .htaccess.txt czy jednak wszędzie jest .htaccess?

  37. @Jaco napisał:

    Pewnie masz Joomla!.

    htacces.txt to plik roboczy, jego nazwę trzeba zmienić na .htaccess

  38. Bartko napisał:

    A ja mam jeszcze male pytanko:

    Zrobilem tak jak w artykule i wszystko smiga tak jak trzeba czyli :

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(www\.)?portraityourloveone.co.uk(.*) [NC]
    RewriteRule ^(.*)$ http://www.portraityourlovedone.co.uk/$1 [R=301,L]

    a jak zrobic zeby oprocz przekierowan z domena1 i http://www.domena1 na http://www.domena2
    zrobic jednoczesnie przekierowanie z domena2 na http://www.domena2?
    Pozdrawiam

    Bartek

  39. MariuszT napisał:

    @Bartko
    http://www.tarnaski.eu/blog/przekierowanie-301/, link jest w pierwszym zdaniu tego wpisu…

  40. Bartko napisał:

    Mariuszt

    dzieki za info ale pytalem raczej o to jak te oba kody polaczyc, czy wystarczy wstawic jeden pod drugim o tak?

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(www\.)?portraityourloveone.co.uk(.*) [NC]
    RewriteRule ^(.*)$ http://www.portraityourlovedone.co.uk/$1 [R=301,L]
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^portraityourlovedone.co.uk(.*) [NC]
    RewriteRule ^(.*)$ http://www.portraityourlovedone.co.uk/$1 [R=301,L]

    czy trzeba cos pokombinowac inaczej .

    Dzieki za pomoc.

  41. MariuszT napisał:

    Reguły wystarczy wstawić jedna pod drugą. Pamiętaj aby „RewriteEngine On” wstawiać tylko raz czyli u Ciebie czwartą linijkę możesz wykasować, zostawić pustą.

  42. Krzysiek napisał:

    Witam,

    a u mnie sytuacja wyglada tak.
    Jak stawiałem bloga to miał adres comfoline.pl/blog, pozniej zmienilem na blog.comfoline.pl

    Czy w tym przypadku tak napisana reguła jest prawidłowa:
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www.comfoline.pl/blog(.*) [NC]
    RewriteRule ^(.*)$ http://blog.comfoline.pl/$1 [R=301,L]

    Plik htaccess nalezy dodac do glownego folderu na ftpie czy do folderu w ktorym znajduje się blog?

  43. MariuszT napisał:

    @Krzysiek
    Powinno to wyglądać mniej więcej tak:
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(www\.)?comfoline.pl$ [NC]
    RewriteCond %{REQUEST_URI} ^blog/(.*) [NC]
    RewriteRule ^(.*)$ http://blog.comfoline.pl/$1 [R=301,L]

    Nie testowałem.

    Plik .htaccess wstaw tam gdzie masz bloga.

  44. Krzysiek napisał:

    Dziekuje. Mam nadzieje, że zadziała :)

  45. Krzysiek napisał:

    Jeśli miałoby działać to pomimo wpisania adresu witryny http://www.comfoline.pl/blog po załadowaniu witryny powinno sie pojawić na pasku http://blog.comfoline.pl/
    ?

  46. MariuszT napisał:

    Tak, adres powinien się zmienić. Jednak zamiast pytać polecam po prostu sprawdzić samemu :)

  47. Krzysiek napisał:

    Sprawdziłem i się nie zmienia dlatego pytam :)

  48. MariuszT napisał:

    Jak się nie zmienia jak się zmienia :P

  49. Joland napisał:

    Mam pytanie
    Zastosowałem pierwszy kod na tym wpisie i ładnie przekierowuje domenę na drugą, ale pojawia się problem gdy przechodzę z google z podstrony domeny1. Tutaj przekierowuje na ten sam katalog na domenie2. Ale ja nie mam takiego katralogu i wyskakuje błąd, Chciałbym aby każda podstrona znaleziona w google przekierowywała na stronę główną mojej nowej strony.

  50. MariuszT napisał:

    Tutaj padło pytanie o przekierowanie na stronę główną gdy nie ma jakiejś strony http://www.tarnaski.eu/blog/pr.....mment-3557. Przeczytaj moją odpowiedź, która jest tuż pod wyżej wymienionym komentarzem.

    Jeżeli nie chcesz przekierowywać w ogóle żadnych katalogów i wszystko ma prowadzić na stronę główną to można to zrobić tak:
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(www\.)?domena1.pl(.*) [NC]
    RewriteRule ^(.*)$ http://www.domena2.pl/ [R=301,L]

    Bardzo drobna zmiana jak widzisz.

  51. Joland napisał:

    Dzięki

  52. mirek napisał:

    Witaj MariuszT

    No i jest pętelka:

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(www\.)?domena.pl(.*) [NC]
    RewriteRule ^(.*)$ http://www.domena.pl/index.php [R=301,L]

    to jak wykluczyć przekierowanie index.php na index.php ?

    Dzięks!

  53. MariuszT napisał:

    Pisane z głowy, nie testowałem:

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

Odpowiedz



Podobne wpisy: