relons

FAQ: .htaccess, 301 i inne SEO porady

2 posty w tym temacie

Postanowiłem napisać mini FAQ o .htaccess specjalnie pod kątem SEO. Same najważniejsze informacje, maksimum treści żebyście potrafili przerabiać/sklejać istniejące już .htaccess na swoje potrzeby. Jeżeli coś pominąłem i będziecie mieli pytania to piszcie - rozbuduje ten temat o kolejne przykłady.

Na jakiej zasadzie działają reguły RewriteCond i RewriteRule? (krótki wstęp, reszta będzie w przykładach)

RewriteRule to reguły przepisywania URLi, wykonywane są jedna po drugiej, chyba, że na końcu, w nawiasie kwadratowym wpisane jest L co oznacza, że dana reguła jest ostatnia i kolejne RewriteRule nie mają zostać wykonywane.

RewriteCond jest opcjonalnym wyrażeniem warunkowym, który musi być spełniony aby reguły w RewriteRule zostały wykonane. Wstawia się je przez RewriteRule, wyrażenia sprawdzane są jedno po drugim ze spójnikiem logicznym AND (czyli wszystkie warunku muszą zostać spełnione), chyba, że na końcu w nawiasie kwadratowym wstawimy warunek OR. Reguły RewriteCond dotyczą tylko i wyłącznie pierwszej reguły RewriteRule wpisanej za nimi.

Jak przekierować domenę, przy wejściach bez WWW na format www.domen.tld?

# reguła testująca - jeżeli domena nie ([i]![/i]) zaczyna się ([i]^[/i]) od www ([NC] oznacza niewrażliwość na małe/duże litery)
RewriteCond %{HTTP_HOST} !^www. [NC]
# reguła przepisująca, wykonywana tylko kiedy warunek reguły testującej (RewriteCond) jest spełniony (w [] L oznacza ostatnią regułę, R=301 oznacza przekierowanie 301)
RewriteRule ^(.*)$ http://www.domena.tld/$1 [L,R=301]

Jak przekierować wejście z www.domena.tld/index.php bez parametrów na www.domena.tld?

# reguła testująca - jeżeli wywołaniem jest dokładnie ciąg znaków "/index.php" i żaden znak więcej ($ oznacza koniec ciągu, ^ początek) 
RewriteCond %{REQUEST_URI} ^\/index.php$
# reguła testująca - sprawdza czy nie ma zapytania ?param1=1&param2=2
RewriteCond %{QUERY_STRING} ^$
# reguła przepisująca 
RewriteRule ^(.*)$ http://domena.tld/ [L,R=301]

Jak połączyć powyższe dwa listingi, aby po wpisaniu w do przeglądarki http://domena.tld/index.php przekierowało użytkownika na http://www.domena.tld/ ?

RewriteEngine on
# warunek zostanie spełniony tylko przy pierwszym wywołaniu, kiedy nastąpi wejście bez www. (z http://domena.tld/index.php)
RewriteCond %{HTTP_HOST} !^www. [NC]
# w tym miejscu nastąpi przekierowanie na przeglądarki na http://www.domena.tld/index.php
RewriteRule ^(.*)$ http://www.domena.tld/$1 [L,R=301]

RewriteCond %{REQUEST_URI} ^\/index.php$
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^(.*)$ http://domena.tld/ [L,R=301]

Jak przekierować masowo domeny, przy wejściach bez WWW na format www.domen.tld?

RewriteCond %{HTTP_HOST} !^www. [NC]
# dodatkowo sprawdzam czy host nie jest adresem IP (czyli czy nie kończy się cyfrą)
RewriteCond %{HTTP_HOST} ![0-9]$ [NC]
# w RewriteRule można wpisać %{HTTP_HOST} zamiast konkretnej domeny
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L,R=301]

Zmieniłem linkowanie na stronie. Jak przekierować konkretne stare URLe na nowe?

Rozpatrzmy przypadek, kiedy użytkownik chce przejść z URLi:

http://www.domena.tld/index.php?strona=1

http://www.domena.tld/index.php?strona=4

http://www.domena.tld/index.php?strona=23

na URLe:

http://www.domena.tld/1/Jakis+Opis.html

http://www.domena.tld/4/Nazwa+Dzialu.html

http://www.domena.tld/23/Jakis+inny+opis+lub+nazwa.html

# zwróć uwagę na to, że adres przekierowania jest bez pełnego URLa oraz bez przekierowania 301 (jest to przekierowanie wewnętrzne serwera, niewidocznie dla przeglądarki internetowej)
RewriteRule ^([0-9])\/([^.]+)\.html$ /index.php?strona=$1
# pod $2 jest opis, można użyć też takiej konstrukcji
# RewriteRule ^([0-9])\/([^.]+)\.html$ /index.php?strona=$1&opis=$2

Jeżeli chcesz połączyć ten warunek razem z poprzednimi wystarczy go dodać na samym końcu pliku .htaccess.

Moje przepisywanie URLi nie działa przy RewriteRule bez podawania pełnego URLa z domeną

Zaraz za RewriteEngine on dopisz:

# jeżeli twój .htaccess jest w katalogu głównym domeny:
RewriteBase /
# jeżeli twój .htaccess jest w podkatalogu costam (http://www.domena.tld/costam)
# RewriteBase /costam/
# nie zapominaj o końcowym slashu

Powyższy problem ten występuje m.in. na home.pl

Pełna dokumentacja: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html

[dodane]

Od siebie dodam jeszcze:

Mini tutorial używania mod_rewrite z życiowymi przykładami

Edytowano przez relons

Sprawdź liderów systemów wymiany linków:

linkme.pl (stały), gotlink.pl (rotacyjny)

alexain.jpgalexaol.jpgalexaat.jpg

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

To ja dorzucę jeszcze tak po mojemu :)

Podstawy mod_rewrite (.htaccess) - przyjazne linki.

Budowa adresu:

http://www.forum.optymalizacja.com/index.php?showforum=9

"http://" - protokół http

"www.forum.optymalizacja.com" - HTTP_HOST

"/index.php" - REQUEST_URI

"showforum=9" - QUERY_STRING

Idea stosowania mod_rewrite polega na używaniu w skryptach (i nie tylko) prostych, krótkich i łatwych w zapamiętaniu odnośników.

Domyślnie serwer apache na podstawie REQUEST_URI poszukuje rzeczywistych plików i katalogów w drzewie DOCUMENT_ROOT.

Dzięki instalacji i aktywacji mod_rewrite uzyskujemy możliwość operowania na "wirtualnym" REQUEST_URI które nie musi się już odnosić

bezpośrednio do "fizycznie" istniejących plików i katalogów tylko pośrednio przez odpowiednie reguły przepisywania.

Oczywiście możliwości mod_rewrite są znacznie większe.

Wszystkie reguły przetwarzania umieszczamy w pliku .htaccess który przetwarzanie wygląda tak:

RewriteEngine On - włączenie przepisywania linków

RewriteBase /halo - linia potrzebna kiedy plik .htaccess znajduje się w innym folderze niż DOCUMENT_ROOT

.* - dalej są zawarte reguły przepisywania

Sam plik .htaccess ma także więcej zastosowań niż przepisywanie linków.

Podstawy przepisywania w praktyce (wymagana znajomość podstaw PCRE i ogólnej wiedzy na temat zmiennych serwera i działania skryptów).

Dyrektywa RewriteRule służy do przeprowadzania operacji na zmiennej REQUEST_URI serwera:

RewriteRule wyrazenie_regularne rzeczywisty_adres [flagi]

"wyrazenie_regularne" będzie dopasowywane do REQUEST_URI otrzymanego z zewnątrz lub z poprzedniej reguły przepisywania (jeżeli taka była).

Przykłady:

- chcemy używać zamiast adresu "http://www.forum.optymalizacja.com/index.php?showforum=9" adresu "http://www.forum.optymalizacja.com/dowcipy/"

RewriteRule ^/dowcipy/?$ /index.php?showforum=9 [L,NC]

- chcemy używać wszystkich kategorii symulując katalogi, musimy dołożyć zmienną określającą numer kategorii "http://www.forum.optymalizacja.com/dowcipy,9/"

RewriteRule ^/[a-z]*,([0-9]*)/?$ /index.php?showforum=$1 [L,NC]

Jeżeli chcemy przekazać część przetwarzanego REQUEST_URI do rzeczywistego adresu umieszczamy odpowiednie części wzorca (wyrażenia regularnego) w nawiasach (),

przechwycone części zostaną umieszczone w zmiennych o nazwach $1, $2, $3 ... $9 według kolejności nawiasów. Zmienna $0 zawiera całość dopasowaną do wzorca.

Flagi - sterują działaniem reguł, są dodawane na końcu w nawiasach []:

[NC] - wielkość liter nie ma znaczenia

[L] - jeżeli REQUEST_URI zostanie dopasowane do wzorca to reguła zawierająca tą flagę zostanie wykonana jako ostatnia.

[QSA] - powoduje doklejenie QUERY_STRING po przepisaniu REQUEST_URI

[R=301] - powoduje przekierowanie 301

RewriteCond - dyrektywa warunkowa, może służyć do przechwytywania i sprawdzania zmiennych serwera.

RewriteCond %{ZMIENNA_SERWERA} wyrazenie_regularne [falagi]

Jeżeli określony warunek RewriteCond zostanie spełniony zostanie wykonana dyrektywa RewriteRule położona bezpośrednio po nim.

Kilka dyrektyw RewriteCond występujących kolejno po sobie tworzy jedną całość powiązaną logicznym warunkiem AND(i).

Flagi:

[OR] - wiąże dyrektywę z następną (bezpośrednio po niej) dyrektywą RewriteCond związkiem logicznym OR(lub)

[NC] - wielkość liter nie ma znaczenia

Przykłady:

- chcemy sprawdzić czy wywołano adres z www

RewriteCond %{HTTP_HOST} ^www\. [NC]

- chcemy sprawdzić czy adres wywołano bez www

RewriteCond %{HTTP_HOST} !^www\. [NC]

- chcemy przechwycić wartości zmiennych QUERY_STRING i przekazać do RewriteRule

RewriteCond %{QUERY_STRING} strona=([a-z]+)&id=([0-9]+) [NC] 
RewriteRule . index.php?s=%1&i%2 [L]

Kolejne części QUERY_STRING zostały przechwycone przez nawiasy do kolejnych zmiennych %1 %2, a %0 zawiera całość dopasowania.

Praktyczne przykłady:

- przekierowanie podstrony na inną podstronę

RewriteRule ^/kotek.html$ /piesek.html [R=301,NC]

- przekierowanie na nową domenę

RewriteRule .* http://nowy-adres.com/$0 [R=301]

- przekierowanie z www na bez www

RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule . http://adres.com [R=301]

- przekierowanie z bez www na www

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule . http://www.adres.com/ [R=301]

- uniwersalne przekierowanie na www z bez www

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* http://www\.%{HTTP_HOST}/$0 [R=301]

Część rzeczy się powtarza ale zostawiam to jako całość.

[dodane]

- przekierowanie na inną domenę, z wyjątkiem tego co znajduje się w katalogu "folder"

RewriteCond %{REQUEST_URI} !^/folder/ [NC]
RewriteRule ^(.*)$ http://www.google.pl/$1 [L,R=301]

Edytowano przez Irek
Temat zamykam, gdyby ktoś chciał coś dopisać to proszę się zgłosić do mnie lub innego moderatora.
1 osoba lubi to

nihil fit sine causa

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość
Temat jest zablokowany i nie można w nim pisać.

  • Kto przegląda   0 użytkowników

    Brak zalogowanych użytkowników przeglądających tę stronę.