Optimizacija sajta [02] DNS i redirekcije

Optimizacija sajta [02] DNS i redirekcije

Updated: 10/08/2019.

Kao što sam pisao u prethodnom članku o problemima sa sajtom, analizom i merenjem utvrdio sam da prilikom traženja adrese sajta, u određenim situacijama dolazi do višestrukih redirekcija početne strane. Ovde ću objasniti kako sam rešio te probleme.

Sadržaj:
1. Uvod – šta je to DNS i redirekcija?
2. Eliminisanje višestrukih redirekcija
…2.1. Vrste podešavanja redirekcije
…2.2. Podešavanje redirekcije pomoću php koda
…2.3. Podešavanje redirekcije izmenama .htaccess fajla
…2.4. Redirekcije pomoću Cloudflare servisa
…2.5. HSTS podešavanje
3. Moji rezultati
Izvori

1. Uvod – šta je to URL, DNS i redirekcija?

Koristiću se primerom za objašnjenje. U momentu pisanja ovog članka, ukucavanje IP (v4) adrese: “172.217.10.14″ u polje za adresu veb-pregledača, odvešće Vas na sajt google.com. Taj deo je manje problematičan – svi računari na Internetu imaju neku svoju IP adresu (prosto i grubo rečeno). Problem je kada se ukuca (kao što svi kucaju): “google.com”, kako pregledač zna kuda treba da “ode” ? Tako unešena adresa, lakša ljudima za razumevanje i pamćenje, naziva se URL (eng. Uniform Resource Locator).

Tu na scenu stupaju DNS-ovi (eng. Domain Name Server). Kada ukucate google.com, računar se obraća najbližem DNS-u i pita ga zna li gde je to? Za sajtove koji su dugo na Internetu, DNS-ovi obično znaju, ili barem znaju ko od DNS-ova “u komšiluku” zna kuda se ide kad pitaš za google.com. Ovo može da se nastavi sa nekoliko sličnih “skokova”, ali na kraju se dođe do adrese. Ta adresa ostaje “zapisana u adresaru” DNS-a, kako za sledeći put ne bi morao da zapitkuje komšije (grubo i prosto rečeno).

Ovim je problem u praksi prilično dobro rešen. Nije ništa prostije za implementaciju nego što zvuči u objašnjenju (upravo suprotno), ali radi!

Kada nastaje problem? U primeru google.com, treba imati na umu sledeće:

  • Googlova Internet adresa nije google.com, nego www.google.com.
  • Google koristi SSL enkripciju i https protokol, tako da mu je puna adresa: https://www.google.com.

Šta se u tom slučaju dešava kada ukucamo “google.com” i računar pita DNS za adresu? Redirekcija! To izgleda otprilike ovako:

  • Računar: Znaš li gde je google.com
  • DNS: Svakako, idi na 172.217.10.14.
  • Računar: Kuc, kuc, 172.217.10.14, da li je google.com tu?
  • Googlov host: Probaj na http://google.com.
  • Računar: Kuca na druga vrata, je li google tu?
  • Googlov host: E, nabavio je SSL zaštitu, vidi na https://google.com.
  • Računar: Tebi je ovo zabavno?!
  • DNS: Pos’o je takav…
  • Računar: OK – GDE JE https://google.com?!
  • DNS: https://www.google.com. Što nisi odmah rekao da to hoćeš?

OK, za razliku od administrora, računari i serveri se uglavnom ne daju isprovocirati… tako je, ne? 🙂  Ali ova silna preusmerenja potroše dosta vremena. Postoji li način da se serveru kaže kako da daje pravu adresu odmah, bez obzira na način na koji posetilac formuliše pitanje (google.com, www.google.com, ili https://www.google.com)? Odgovor je DA. O tome u narednom poglavlju.

Dodatna “čar” je što sajtovima na deljenim (eng. shared) hostinzima, bez svoje jedinstvene IP adrese, ne može biti pristupljeno samo po IP adresi, već je potrebno uneti URL, kako bi host-server znao koji sajt treba da “otvori” korisniku, od svih sajtova koje hostuje.


2. Eliminisanje višestrukih redirekcija

Za rešavanje višestrukih preusmerenja postoji nekoliko različitih načina. Svaki ima svojih prednosti i mana. Pročitao sam puno stručih (i “stručnih”) tekstova koji govore o tome kako ih implementirati i “koji je najbolji”. Iz mog dosadašnjeg iskustva uveren sam da za veliku većinu stvari ne postoji “najbolje” rešenje, već “optimalno” rešenje (rešenje koje je za datu namenu, sa datim resursima i prioritetima “najbolje”, ili “najmanje loše”). U poglavlju “Izvori” na kraju teksta, ostavio sam linkove (na engleskom su tekstovi) koji objašnjavaju različite načine implementacije. Ovde ću dati samo kratak pregled različitih metoda i detaljan pregled rešenja koje sam ja koristio jer se najbolje pokazalo za moj sajt.

Uz dobro optimizovan sajt i dobar server, redirekcije uglavnom ne troše previše vremena, ali je to vreme svakako nepotrebno potrošeno i “višak” redirekcija se može eliminisati (samo smeta, ničemu ne koristi).

Provera da li sajt vrši višestruke redirekcije može se najbrže uraditi pomoću alata GTmetrix.

Multiple redirections warning and low score with GTmetrix test. Picture 1
Upozorenje o višestrukim redirekcijama i loš rezultat po GTmetrix merenju.
Slika 1

2.1. Vrste podešavanja redirekcije

Postoje dve raziičite osnovne “vrste” podešavanja redirekcije: privremena i “trajna”.

  • Privremena redirekcija, koja se implementira kodom “302” (kasnije o tome) je redirekcija koja govori pregledaču: sada idi na tu adresu.
  • “Trajna” redirekcija, koja se implementira kodom “301” govori pregledaču: zapamti ovu redirekciju i koristi je svaki put u buduće.

Ovo je važna razlika. Trajna redirekcija ostaje na snazi dok kod se keš iz pregledača ne obriše, tj. dok god pregledač pamti 301 redirekciju koju je dobio kada je posetio sajt. Privremena redirekcija, kako joj ime kaže, će biti korištena od strane pregledača, ali će pri sledećoj poseti pregledač ponovo pogledati (izmenjena?) uputstva o redirekciji.

Prilikom implementiranja i testiranja redirekcija, najbolje je prvo koristiti 302 (privremene) redirekcije, dok se ne utvrdi da sve lepo radi, pa ih onda zameniti kodom 301 – “trajnim” (do brisanja keša pregledača posetioca, što može biti i više od godinu dana). Trajne redirekcije je važno postaviti na kraju, jer njih pregledač “pamti” i njihovim korištenjem se eliminišu višestruke nepotrebne redirekcije.

Poseban slučaj je korištenje HSTS (eng. HTTP Strict Transport Security), ukoliko se koristi SSL/TLS enkripcija. Ali OPREZ – objašnjenje je u poglavlju 2.5.

2.2. Podešavanje redirekcije pomoću php koda

Php kod se upisuje na svaku stranicu na sajtu, sa podešavanjem željene redirekcije. Primer implementacije redirekcije na https protokol pomoću php funkcije nazvane “preusmeri_http_na_https” :

< ?php function preusmeri_http_na_https() { if($_SERVER[‘HTTPS’]!=”on”) { $redirect_url= “https://”.$_SERVER[‘HTTP_HOST’].$_SERVER[‘REQUEST_URI’];header(“Location:$redirect_url”); } } ?>

Funkcija proverava da li https protokol nije aktivan, ako nije ( if($_SERVER[‘HTTPS’]!=”on”) ), pa ako nije, primenjuje redirekciju definisanu pod promenljivom “redirect_url”.

Mana ovog pristupa je što se izvršava na svakoj strani, za svaku stranu. To je ujedno i glavna prednost – ako je potrebno vršiti puno različitih redirekcija, u zavisnosti od toga koja stranica se poseti, izvršavaće se samo kôd redirekcija koje su potrebne, kada se poseti konkretna stranica.

2.3. Podešavanje redirekcije izmenama .htaccess fajla

.htaccess fajl nalazi se u root direktorijumu sajta. Obično je podešen da bude “nevidljiv” , tako da podesite ftp alat da prikazuje i nevidljive fajlove. U njemu se nalaze instrukcija za konfiguraciju Apač servera.

a) Primer pravljenja redirekcije na https, uz dodavanje www. ako nije unešeno:

# GREMLIN CHANGES BEGIN
RewriteEngine on
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.example.com%{REQUEST_URI} [L,R=301]
# GREMLIN CHANGES END

Ovaj kod rediriguje:

  • http://example.com
  • http://www.example.com
  • https://example.com

na: https://www.example.com

Promeniti “example.com” na svoj domen, naravno.

b) Uklanjanje www, uz https redirekciju:

# GREMLIN CHANGES BEGIN
RewriteEngine on

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=302,L]

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]
# GREMLIN CHANGES END

Ovaj kod rediriguje:

  • http://example.com
  • http://www.example.com
  • https://www.example.com

na: https://example.com

Radi i za pod-domene, tako da će http://www.sub.example.com biti preusmeren na https://sub.example.com
Pazite samo na SSL/TLS sertifikate. Većina besplatnih (kao LetsEncrypt) pokriva samo *.example.com, ali ne i *.*.example.com, tako da https://www.sub.example.com neće raditi! Tako da mora biti ili sub.example.com, ili www.example.com da bi https radio.

c) Redirekcija na https, bez promene www (bilo dodavanja, ili eliminisanja):

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

U primeru a), podešena je trajna (301), a u primeru b) privremena (302) redirekcija. Privremenu redirekciju (302) je bolje koristiti dok se sve ne istestira i ne utvrdi da dobro radi.

2.4. Redirekcije pomoću Cloudflare servisa

Cloudflare servis ima svojih prednosti i mana (o tome možda nekom drugom prilikom), ali svojim korisnicima omogućava između ostalog i podešavanje redirekcija na njihovom serveru (preko kojeg se stiže do host servera sajta). Kako podesiti redirekcije preko Cloudflare?

Prvo je potrebno uneti A i CNAME zapise u DNS na Cloudflare-u, na sledeći način:

Setting up of bike.bikegremlin.com, as a subdomain of bikegremlin.com, pointing to the same IP address (address is chosen as an example here, it’s not the “real” one).
Biranje DNS panela u Cloudflare i podešavanje pod-domena.
U ovom slučaju bike.bikegremlin.com je definisan kao pod-domen, na istoj adresi kao i glavni, bikegremlin.com domen (adresa je uzeta za primer, nije “prava”).
Slika 2

Nakon ovoga, u DNS listi na istoj strani, pojaviće se novi red:

New row in the DNS table. Where do you point when asked about bike.bikegremlin.com. Picture 3
Novi red u DNS tabeli – kuda pokazuješ kada te pitaju za bike.bikegremlin.com .
Slika 3

Zatim je potrebno uneti polja za “razumevanje” www adresa, ako se tako unesu u pregledaču. To se radi korištenjem CNAME parametra – tj. alijasa. “Objasnićemo” DNS-u da je www.bikegremlin.com isto što i bikegremlin.com, kao i da je www.bike.bikegremlin.com isto što i bikegremlin.com, koristeći sledeće unose:

CNAME record for domain. Picture 4a
CNAME polje za domen. Slika 4a
Sub-domain CNAME entry. Picture 4b
CNAME polje za pod-domen. Slika 4b

To će dati nova polja u DNS tabeli:

New CNAME fields in the DNS table. Picture 5
Nova CNAME polja u DNS tabeli .
Slika 5

Sledeći korak je definisanje redirekcija. To se radi u delu “Page Rules”. Pri definisanju ovih pravila, važno je imati dve stvari na umu:

  • Može se postaviti više pravila.
  • Pravila se izvršavaju redom, od prvog na vrhu, ka poslednjem – poštujući redosled po kojem su poređana.
  • Samo jedno pravilo se izvršava po zahtevu za adresu.

Pod poslednje navedenim se misli na to – prvo pravilo koje odgovara upitu se izvršava. Biće jasnije kada se vide primeri pravila.

Subdomain Page Rule. Picture 6
Page Rule za pod-domen.
Slika 6

Pravilo za pod domen.

  • Zvezdica ( * ) zamenjuje bilo koji tekst, bilo koje dužine.
  • Znaci dolara sa brojem ubacuju tekst koji je “pokriven” zvezdicama, po redu – $1 za prvu zvezdicu, $2 za drugu i tako redom.

Ovo pravilo preusmerava sve navedeno na goli bikegremlin.com pod-domen:

  • www.bike.bikegremlin.com -> https://bike.bikegremlin.com
  • www.proba.bikegremlin.com -> https://proba.bikegremlin.com
  • www.bikegremlin.com ne odgovara ključu, jer ima samo jednu tačku posle www, bez ičega drugog unešenog.
  • bike.bikegremlin.com takođe ne odgovara ključu, tako da ovo pravilo neće biti pokrenuto.

Ovo pravilo “hvata” sve pod-domene bikegremlin.com koji su unešeni sa www (a ne bi trebalo, “goli” su, bez www). Sledeće pravilo rešava situaciju ako se glavni domen, www.bikegremlin.com unese bez www (a trebalo bi):

Page rule list. Picture 7
Spisak pravila.
Slika 7

Drugo pravilo preusmerava bikegremlin.com direktno na https://www.bikegremlin.com. Prvo pravilo ovo neće “uhvatiti”, pošto nema www.

Ova dva pravila rešavaju problem pogrešno unetih adresa. Dobar dodatak bi bilo pravilo koje sve ispravno unete adrese preusmerava na https. Ono bi trebalo da stoji nakon (ispod) prva dva pravila, kako bi se aktiviralo za adrese koje se ne poklapaju sa ključem prethodno unetih pravila. Primer:

http://*bikegremlin.com/*
Always use HTTPS (opcija u meniju za pravila stranica)

Stavljanje ovog pravila na početak bi (pogrešno) preusmerilo bikegremlin.com na https://bikegremlin.com, umesto na https://www.bikegremlin.com!

2.5. HSTS podešavanje

Podešavanje sajta da koristi HSTS je način da se izbegne jedna redirekcija, jer se time pregledačima govori da odmah pređu na https protokol za pristup sajtu.

Ipak, treba biti oprezan – kada se jednom podesi i u potpunosti implementira, mirni ste godinu-dve, sviđalo vam se to ili ne! Naime, toliko pregledači pamte podešavanje, pa treba dobro testirati pre implementacije, a ni ne postavljati je ako se ne planira trajno korištenje SSL sertifikata/enkripcije.

Ovo se može raditi ručno, podešavanem na samom serveru, uz izbor kraćeg perioda važenja, radi testiranja. Dalje objašnjavanje HSTS prevazilazi temu ovog članka. Dovoljno je reći da ovaj metod služi za sajtove koji su sa velikim rizikom od napada i presretanja saobraćaja (on-line trgovina, sajtovi na meti hakera i sl.). HSTS je najbolje da implementiraju profesionalci, uz druge dodatne mere bezbednosti. Za “obične” sajtove može stvoriti dosta glavobolje (i potrebe za pomoć profesionalaca).

Više detalja o HSTS je u članku o bezbednosti WordPress sajta.

Napomena: pravila za preusmerenje opisana u ovom članku bi se morala malo izmeniti ako se ide na HSTS. Naime, iz tehničko/bezbednosnih razloga, HSTS “ne voli” pravljenje “direktnih” redirekcija. Najbolje objašnjeno pomoću slike 8:

HSTS compliant redirections. Picture 8
Redirekcije po HSTS standardu.
Slika 8


3. Moji rezultati

Ja sam se odlučio za podešavanje preusmerenja preko Cloudflare servisa. Brz test preko GTmetrix pokazuje da je sada sve ok – slika 9.

GTmetrix says no redirection problems. Picture 9
GTmetrix kaže da nema problema sa višestrukim redirekcijama .
Slika 9

Rezultati prosečnog vremena redirekcije, u perioud od dve nedelje pre i dve nedelje nakon podešavanja redirekcija, dati su na slici 10.

Average redirection time statistics from Google Analytics. Picture 10
Statistika prosečnog vremena redirekcije iz programa Google Analytics .
Slika 10

Ove vremena su relativno kratka spram ukupnog vremena učitavanja stranice koje traje nekoliko sekundi. Ipak, nema potrebe za gubljenjem vremena i opterećivanjem servera silnim redirekcijama, ako one ničemu ne služe, a mogu se eliminisati.

– Relja Skretničar Novović


Izvori (sajtovi su na engleskom)

Share...

Komentiraj

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.