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).