Prikaz jedne poruke
Stara 16.2.2022, 18:39   #2
Neutrino
Deo inventara foruma
 
Član od: 17.6.2011.
Poruke: 7.336
Zahvalnice: 94
Zahvaljeno 3.334 puta na 2.010 poruka
Određen forumom Re: RewriteRule problemi

TL;DR Znam, udavih ali ovo je često predmet konfuzije pa bih da objasnim kad sam već ovde

Prepisivanje (rewrite) URL-ova pomoću mod_rewrite modula ima dva režima rada: lokalni i eksterni. Podrazumevano se koristi lokalni ukoliko se eksplicitno ne zahteva eksterni.

Kada se koristi lokalni režim, kompletan proces "prepisivanja" URL-a se vrši na serveru i browser kao odgovor dobija traženi resurs bez ikakvih dodatnih instrukcija servera gde bi browser stvarno trebalo da potraži traženi resurs pa se tako u lokalnom režimu ne menja adresa browsera.

Primer lokalnog prepisivanja bi upravo bio tvoj kod.

Kod:
# .htaccess
RewriteEngine On
RewriteRule ^en$ /index_r.php?lang=en [L]
Fajl index_r.php ovde služi isključivo da pokaže da li se redirekcija odigrala i ako jeste da ispiše vrednost lang parametra ako postoji.
PHP kod:
<?php
// index_r.php
echo $_GET['lang'] ?? '-/-';
Ako uključiš opciju Preserve Log u Chrome Developer Tools-u videćeš da u odzivu server šalje status kod (Status Code) 200 OK što generalno znači da je server odradio svoje i da je time zahtev klijenta (browsera) uspešno opslužen.



Sa druge strane, kod eksterne redirekcije server nakon prijema zahteva browsera, detektuje i obrađuje prepisivanje URL-ova ali u odgovoru umesto traženog resursa šalje "prepisani" URL koji služi kao putokaz browseru gde da nađe resurs koji je originalno tražio. Kod eksterne redirekcije promena adrese u browseru je uvek vidljiva.

Eksterna redirekcija mora da se zahteva eksplicitno dodavanjem R Apache flaga na kraju RewriteRule direktive pri čemu se ako se ne navede HTTP kod podrazumeva 302 Found.

Kod:
# .htaccess
RewriteEngine On
RewriteRule ^en$ /index_r.php?lang=en [L,R]
Kada se pogleda DevTools u headerima odziva jasno može da se vidi 302 Found status kod i Location header koji govori browser-u gde se traženi resurs nalazi nakon čega browser automatski pravi još jedan zahtev sa navedenim URL-om i pri tome menja sadržaj adresnog polja.



Eksterna redirekcija se često koristi sa eksplicitnim navođenjem 301 Moved Permanently status koda kako bi se pretraživačima naznačilo da je stranica koja se nalazi u indeksu premeštena na drugu lokaciju i time očuvao status u indeksu.

Kod:
# .htaccess
RewriteEngine On
RewriteRule ^en$ /index_r.php?lang=en [L,R=301]


Dakle, u ovom slučaju prva opcija je sasvim ispravna i da ne bi došlo do prepisivanja potrebno je korisiti sledeći kod.
Kod:
RewriteEngine On
RewriteRule ^en$ /index.php?lang=en [L]
Međutim, stavka pobrljavka koja često ume da napravi problem prilikom razvoja je da browseri keširaju eksterne redirekcije!

To znači da ako je u bilo kom trenutku korišćena eksterna redirekcija prilikom razvoja (R flag u .htaccess) browser je zapamtio taj par i neće ni pokušavati da kontaktira server već će odmah tražiti "redirektovani" resurs.

U takvim slučajevima najpametnije je raditi razvoj sa isključenim keširanjem u DevTools konzoli (Network / Disable cache).

Poslednja ispravka: Neutrino (18.2.2022 u 0:22)
Neutrino je offline   Odgovor sa citatom ove poruke
Sledećih 4 korisnika se zahvaljuje korisniku Neutrino na korisnoj poruci:
dbaja (16.2.2022), doctor (17.2.2022), Relja (4.5.2022), Remedy (8.3.2022)