Jump to content
relons

FAQ: .htaccess, 301 i inne SEO porady

Recommended Posts

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

Edited by relons
  • Like 1

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

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

alexain.jpgalexaol.jpgalexaat.jpg

Share this post


Link to post
Share on other sites

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]

Edited by Irek
Temat zamykam, gdyby ktoś chciał coś dopisać to proszę się zgłosić do mnie lub innego moderatora.
  • Like 1

nihil fit sine causa

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. Terms of Use Privacy Policy