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":
-
RewriteEngine On
-
RewriteCond %{HTTP_HOST} !^www\. [NC]
-
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
Przekierowanie z "www" na "bez www":
-
RewriteEngine On
-
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
-
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
Blog przede wszystkim o Internecie i mojej pasji jaką jest tworzenie stron www. Ale nie ograniczam się do jednej tematyki, piszę o wszystkim o czym mam ochotę :-)
Anmato napisał: 19.02.09 o godzinie 21:26
Jesteś specem od 301 hehe
Anmato napisał: 19.02.09 o godzinie 21:57
I teraz poprosimy o ten kod w PHP
MariuszT napisał: 19.02.09 o godzinie 23:04
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;
}
?>
Jacek napisał: 05.04.09 o godzinie 23:57
DZięki przed chwilą wstawiłem przekierowanie na mojej www! Pozdawiam
karpiu napisał: 29.05.09 o godzinie 9:59
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 ?
MariuszT napisał: 01.06.09 o godzinie 13:39
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?
virusxd napisał: 27.07.09 o godzinie 1:27
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.
MariuszT napisał: 31.07.09 o godzinie 22:49
Nie każdy ma takie możliwości.
Luzak napisał: 03.09.09 o godzinie 16:20
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
Luzak napisał: 03.09.09 o godzinie 19:36
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.
MariuszT napisał: 03.09.09 o godzinie 22:17
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ć.
Luzak napisał: 10.09.09 o godzinie 12:06
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
MariuszT napisał: 11.09.09 o godzinie 10:42
„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łę.
Luzak napisał: 11.09.09 o godzinie 18:33
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
MariuszT napisał: 11.09.09 o godzinie 19:26
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.
Luzak napisał: 14.09.09 o godzinie 11:15
ok, dzięki za pomoc.
Pzdr.
Luzak
wolvverine napisał: 21.10.09 o godzinie 15:04
dodanie R=301 do takiego przekierowania z kolei wywali serwer:
RewriteRule ^mapa_strony$ index.php?id=site_map [NC,L]
MariuszT napisał: 21.10.09 o godzinie 15:48
Nie wiem czemu to generuje błąd. Tak na oko to nie powinno, najprostsze z możliwych przekierowań. Nie sprawdzałem u siebie.
Helper napisał: 29.12.09 o godzinie 11:04
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ść?
MariuszT napisał: 29.12.09 o godzinie 18:57
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.
q67 napisał: 03.03.10 o godzinie 15:50
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 ?
MariuszT napisał: 03.03.10 o godzinie 17:08
Tak, zrób przekierowanie na starym serwerze na nowy adres.
q67 napisał: 04.03.10 o godzinie 10:34
tylko,że stary serwer jest juz nieaktywny.
MariuszT napisał: 04.03.10 o godzinie 12:34
Musisz mieć dostęp do starej domeny (folderu na który ta stara domena wskazuje) aby zrobić przekierowanie na nowy adres.
q67 napisał: 04.03.10 o godzinie 16:28
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).
MariuszT napisał: 04.03.10 o godzinie 17:31
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.
q67 napisał: 04.03.10 o godzinie 18:10
teraz jeszcze problem bo niemoge utworzyc na serwerze takiego pliku. A serwer też nie obsługuje php. Jakas inna możliwośc ?
MariuszT napisał: 04.03.10 o godzinie 18:40
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.
MŁK napisał: 22.03.10 o godzinie 19:43
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)?
MŁK napisał: 22.03.10 o godzinie 21:10
Jeszcze raz: Nie zauważyłem innego artykułu na ten temat. Pomogły mi oba i to bardzo. Oby tak dalej
MariuszT napisał: 23.03.10 o godzinie 11:36
Czyli mam rozumieć, że już sobie poradziłeś?
MŁK napisał: 23.03.10 o godzinie 11:49
Tak, nie zauważyłem tego na początku artykułu „sporo (tu i tu)” i na linka nie kliknąłem. Pozdrawiam.
Kojot napisał: 12.05.10 o godzinie 16:49
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?
MariuszT napisał: 12.05.10 o godzinie 17:15
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.
Kojot napisał: 17.05.10 o godzinie 16:57
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.
MariuszT napisał: 17.05.10 o godzinie 17:04
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.
Marys napisał: 05.08.10 o godzinie 12:40
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?
MariuszT napisał: 05.08.10 o godzinie 22:19
Zmienić strukturę katalogów
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.
Michał napisał: 06.08.10 o godzinie 17:55
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
MariuszT napisał: 09.08.10 o godzinie 15:35
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?!
Kamil napisał: 12.08.10 o godzinie 16:53
Ad. 4) Mariusz, a czy czasem „zwykłe przekierowanie” to nie właśnie 301? Wydaje mi się, że to dokładnie 301
MariuszT napisał: 12.08.10 o godzinie 16:56
Mylisz przekierowanie 301 z 302.
Kamil napisał: 12.08.10 o godzinie 19:06
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.
Michał napisał: 13.08.10 o godzinie 12:01
Chciałem podać ideę a nie gotowy kod. wystarczy dodać true i response code 301
Pozdrawiam
lamer okrutny napisał: 25.08.10 o godzinie 21:54
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
MariuszT napisał: 28.08.10 o godzinie 0:50
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