Šta je to redirekt i zašta služi
Redirekt - preusmeravanje korisnika sa jednog URL na drugi. Naprimer, prilikom prelaza po linku http://ibpstudio.com/blog brauzer automatski preusmerava korisnika na URL https://ibpstudio.com/blog.
Redirekt pomaže korektno preusmeriti korisnika na potrebne stranice sajta bez posledica korisničkog iskustva i bez kršenja zahteva pretraživača. Pravilno izvršeno preusmerenje ostavlja bez posledica autoritet ili referentnu težinu stranice-donora i predaje je na stranicu-akceptora.
Uvod u Redirekt u .htaccess fajlu
Pravila koja dajemo u daljem tekstu su isprobani na serverima Apache i NGINX.
Pravilo : %{QUERY_STRING} - znači fragment URL-adrese posle znaka pitanja (zadane vrednosti CGI- parametara). Pokretanje određenog pravila redirekta se opredeljuje time dali URL adresa ispunjava pravilo ili ne. Značenje pravila (^, $, NC) ćemo opisati na kraju stranice.
Niže u tekstu privodimo primere najčešćih pravila podešavanja fajla .htaccess za 301-redirekt. Najbolje je pisati pravila posle komandi:
Options +FollowSymLinks
RewriteEngine On
Komentari u fajlu se označuju sa tarabom «#» na početku reda
# Komentar sa tekstom. Ovaj tekst se ne obrađuje serverom.
301-redirekt sa domena bez WWW na domen sa WWW prefiksom
RewriteCond %{HTTP_HOST} ^site\.rs$ [NC]
RewriteRule ^(.*)$ http://www.site.rs/$1 [R=301,L]
Redirekt sa domena sa WWW prefiksom na domen bez prefiksa
RewriteCond %{HTTP_HOST} ^www.site\.rs$ [NC]
RewriteRule ^(.*)$ http://site.rs/$1 [R=301,L]
Za verziju HTTPS:
RewriteCond %{SERVER_PORT} ^80$ [OR]
RewriteCond %{HTTP} =on
RewriteRule ^(.*)$ https://site.rs/$1 [R=301,L]
Standardno preusmeravanje sa jedne statičke stranice na drugu
Redirect 301 /was.php http://www.site.rs/new.php
Kod takvog redirekta novu adresu je neohodno napisati u potpunosti sa htp protokolom i domenom.
Slučaj redirekta sa pravilom RewriteRule
RewriteRule ^dir /dir-new/$1 [R=301,L]
301-redirekt na stranici sa GET parametrima
Recimo, adresa stranice izgleda : http://www.site.ru/dir/index.php?IBLOCK_ID=1&SECTION_ID=111 i u tom slučaju prilikom podešavanja 301 redirekta na novu adresu, treba primeniti sledeće pravilo:
RewriteCond %{QUERY_STRING} ^IBLOCK_ID=1&SECTION_ID=111$ [NC]
RewriteRule ^dir/index\.php$ /new/sef/? [R=301,L]
Ako je neki ili nekoliko GET parametara nisu poznati ili imaju slučajno značenje(kod nas je to SECTION_ID) možemo koristiti sledeći kod:
RewriteCond %{QUERY_STRING} ^IBLOCK_ID=1&SECTION_ID=(.*)$ [NC]
RewriteRule ^dir/index\.php$ /new/sef/? [R=301,L]
301-redirekt sa stranice bez parametra u korenu
AKo imamo adresu: http://www.site.rs/?abc za redirekt koristimo sledećapravila:
RewriteCond %{QUERY_STRING} ^abc$ [NC]
RewriteRule ^$ /? [R=301,L]
301-redirekt za konkretni fajl - nije za ceo folder
Ako treba na podesimo preusmeravanje samo za adresu http://www.site.ru/dir/, ali da se stranica http://www.site.ru/dir/index.php?IBLOCK_ID=1 otvara na staroj adresi, upotrebljavamo specijalan simbol $ u pravilu.
RewriteRule ^dir/$ http://www.site.rs/new-dir/ [R=301,L]
Redirekti sa domenima u zoni СРБ
301-redirekt sa domena na domen
RewriteCond %{HTTP_HOST} ^old-site\.ru$ [NC]
RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L]
Za domen u zoni СРБ
RewriteCond %{HTTP_HOST} ^xn--e1af0af.xn--90a3ac$ [NC]
RewriteRule ^(.*)$ http://www.site.rs/$1 [R=301,L]
Podešavanje preusmeravanja na folder sa kosom crtom na kraju "/"
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\..{1,10}$
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://www.site.ru/$1/ [L,R=301]
Podešavanje preusmeravanja na folder bez kose crte "/" (brišemo "/" na kraju)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.+)/$
RewriteRule ^(.+)/$ http://www.site.ru/$1 [R=301,L]
301-redirekt sa domena na folder na drugom domenu
RewriteCond %{HTTP_HOST} ^si-te\.rs$ [NC]
RewriteRule ^(.*)$ http://www.site.rs/si-te/ [R=301,L]
Redirekt svih fajlova u folderu na odre]eni fajl
RewriteRule ^dir(.*)$ /new-file.php [L,R=301]
Redirekt fajlova iz određenog foldera osim, određenog fajla
RewriteRule ^dir/no-file.html /no-file-new.html [L,R=301]
RewriteRule ^dir(.*)$ /all.php [L,R=301]
Promena stranice sa html na php ekstenzije
RedirectMatch 301 (.*)\.html$ http://www.new-site.ru$1.php
Prenošenje fotografija iz foldera /img/ na poddomen
RewriteRule ^img/(.+)\.jpg$ http://img.domain.rs/$1.jpg [R=301,L]
Opredeljenje tipa indeksne stranice (php, html, htm i dr.)
DirectoryIndex index.html index.php index.htm index.shtml
Redirekt sa indeksne stranice php na sam folder ( koren )
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://www.site.rs/ [R=301,L]
Для всех индексных страниц на сайте:
RewriteRule ^(.*)index\.php$ http://www.site.rs/$1 [R=301,L]
Redirekt sa poddomena na osnovni domen drugog nivoa
RewriteCond %{HTTP_HOST} ^test.site.rs$ [NC]
RewriteRule ^(.*)$ http://site.rs%{REQUEST_URI} [R=301,NC,L,QSA]
Redirekt za određeni fajl u raznim direktorijumima(folderima)
RewriteRule [^abc]/unique-file.html /unique-file.html [R=301,L]
Kod nam dozvoljava staviti 301-redirekt sa svih foldera koji izgledaju http://site.rs/***/uniqe-file.html na jedan fajl u korenu /unique-file.html. Takva operacija je korisna prilikom prepravke sajta i promeni linkova.
RewriteRule ^testovi/test/?$ /studio/news/detail.php?ID=230354&PAGEN_2=11 [NC,L]
Kod dozvoljava napravitu kopiju stranice sa relativnom adresom /studio/news/detail.php?ID=230354&PAGEN_2=11 na adresi /testovi/test/
301-redirekt sa HTTPS-verzije na HTTP
RewriteCond %{HTTPS} "on"
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,QSA]
Omogućava eliminisati prisustvo dublova URL sa HTTPS u indeksu pretraživača.
RewriteCond %{SERVER_PORT} ^80$ [OR]
RewriteCond %{HTTP} =on
RewriteRule ^(.*)$ https://domain.rs/$1 [R=301,L]
ErrorDocument 404 /404-for-me.php
Sva pravila se ispunjavaju redom od gore na dole napisane u fajlu .htaccess i pravilo koje je napisano kasnije, kasnije će se izvršiti.
Brišemo sve GET parametre posle znaka pitanja (?)
RewriteRule (.*) $1? [R=301,L]
Piše se posle : RewriteBase /
Sintaksa za regularne izraze
. - Tačka zamenjuje bilo koji proizvoljan simbol.
[abc] - označava spisak simbola, koji se podudaraju sa slovima a, b, ili c.
[^abc] - spisak simbola, koji ne spadaju u napisani dijapazon. Sve osim a,b, ili c.
* - znači da budući simbol može da se ponavlja bezbroj puta (0 ili više puta).
[abc]* - komanda nalazi simbole kako su redom napisani.
[^abc]* - nalazi simbole obrnutim redom.
.* - zamenjuje absolutno bilo koji simbol ".*" - sav sadržaj između znakova interpunkcije.
^ - početak reda (u slučaju, ako se koristi na početku izraza).
$ - označava kraj reda.
\w - slovo, broj ili donja crtica _.
\d - zamenjuje bilo koji broj.
\D - zamenjuje bilo koji simbol, osim broja.
[0-9] - zamenjuje bilo koji broj.
[a-z] - bilo koje slovo ot a do z (latinica) mala slova.
[A-Z] - bilo koje slovo ot A do Z - velika slova.
[a-zA-Z] - bilo koje slovo od a do Z - i mala i velika slova.
[a-Z] - isto kao i prethodno.
Specijalni simboli koji se upotrebljavaju u fajlu .htaccess
- ^ - specijalan simbol početka reda(string);
- $ - specijalni simbol kraja reda;
- ! - specijalni simbol negiranja;
- . - tačka, koja zamenjuje bilo koji simbol, ali samo jedan;
- () - grupisanje;
- \ - «ekranizacija» kosa crta, sledeći simbol posle kojeg se računa kao običan, a ne kao specijalni simbol;
- # - početak komentara teksta u fajlu.
Modifikatori
Koriste se posle običnih specijalnih simbola ili njihovih grupa koji nam dozvoljavaju raširiti mogućnost šablona.
- ? - simbol se ponavlja 0 ili 1 put.
- + - ponavlja se od 1 do 65536 puta.
- * - ponavlja se od 0 do 65536 puta.
Zastavice
Zastavice daju dopunjujuće opcije za korištenje pravila. Zapisuju se u kvadratnim zagradama, sa zarezom između njih, primer [NC] ili [R=301,L].
- NC — zastavica NoCase, ograničava proveru registra(malih i velikih slova) prilikom pokretanja pravila.
- R — zastavica Redirect, proizvodi proces stopiranja promeni URL-adrese i vraća nam rezultat. Najčešće se koristi R=301, ali se može koristiti i drugi za određeni vremenski redirekt (302, MOVED TEMPORARY).
- L — zastavica Last, zaustavlja formiranje URL-adrese i red se smatra završenim.