Kako izvesti interno preusmjeravanje s mod_rewrite u Apacheu
U ovom i sljedećem članku objasnit ćemo kako koristiti mod_rewrite za mapiranje određenih HTTP zahtjeva na druge stranice na web stranici ili na vanjski URL.
Drugim riječima, ovaj dobro poznati Apache modul omogućit će vam preusmjeravanje URL-a na drugi, što ćemo ilustrirati kroz praktične primjere.
Predloženo za čitanje: 5 savjeta za poboljšanje performansi vašeg Apache web poslužitelja
NAPOMENA: Primjeri ispod pretpostavljaju da ste barem donekle upoznati s regularnim izrazima kompatibilnim s Perlom (PCRE). Budući da je ta tema izvan opsega ovog članka, više detalja o PCRE-u potražite u dokumentima za Perl 5 verziju 24.0.
Prije nego nastavite, provjerite je li učitan modul za ponovno pisanje. Iako je ovo zadano ponašanje u CentOS i sličnim distribucijama, u Debianu i izvedenicama morat ćete ga učitati ručno na sljedeći način:
a2enmod rewrite
Konfiguriranje Apachea za korištenje mod_rewrite modula
Radi jednostavnosti, upotrijebimo zadanu stranicu u okviru CentOS 7 (IP 192.168.0.100) da objasnimo kako koristiti mod_rewrite ( DocumentRoot: /var/www/html, konfiguracijska datoteka: /etc/httpd/conf/httpd.conf).
Kako bi Apache mogao koristiti ovaj modul, dodajte sljedeći red u konfiguracijsku datoteku:
RewriteEngine on
Važno je napomenuti da ovu konfiguraciju neće naslijediti virtualni hostovi u istom okviru.
Stoga ćete morati dodati RewriteEngine za svaki virtualni host na kojem želite koristiti pravila prepisivanja.
Interno preusmjeravanje: preslikavanje URL-a na drugi u istom virtualnom hostu
Interno preusmjeravanje je najjednostavniji primjer mod_rewrite. Ako želite preusmjeriti sve zahtjeve za default.aspx na index.html, dodajte sljedeći redak (također poznat kao pravilo prepisivanja) pod RewriteEngine > na:
RewriteRule "^/default\.aspx$" "/index.html"
i ne zaboravite ponovno pokrenuti Apache kako bi promjene stupile na snagu.
Ovo bi moglo biti korisno ako je vaša web-lokacija izvorno dizajnirana pomoću ASP-a i kasnije promijenjena u običan HTML5. Tražilice će imati indeksiranu datoteku .aspx
, ali ta datoteka više ne postoji.
U tom slučaju morat ćete pronaći način da preusmjerite zahtjev tako da vaši potencijalni posjetitelji ne naiđu na stranicu s pogreškom. Za testiranje, stvorimo jednostavnu HTML datoteku pod nazivom index.html
unutar /var/www/html sa sljedećim sadržajem:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>New site</title>
</head>
<body>
<h2>Default.aspx was here, but now it's index.html</h2>
</body>
</html>
Znakovi caret i dollar uzrokovat će podudaranje regularnog izraza s bilo kojim nizom koji počinje s /default
i završava s .aspx
, odnosno.
Predloženo za čitanje: Instalirajte Mod_Pagespeed da biste ubrzali rad Apachea do 10x
Sada pokrenite preglednik i usmjerite ga na 192.168.0.100/default.aspx. Ako stvari idu kako se očekuje, Apache bi umjesto toga trebao služiti index.html
.
Međutim, krajnji korisnik će i dalje vidjeti default.aspx
u adresnoj traci zbog čega će promjena biti potpuno transparentna:
Ako želite da URL u adresnoj traci pokazuje da poslužitelj koji zapravo poslužuje index.html
umjesto stranice pod nazivom default.aspx
, dodajte [R, L]
do kraja pravila prepisivanja kako slijedi:
RewriteRule "^/default\.aspx$" "/index.html" [R,L]
Ovdje su [R,L]
dvije opcijske zastavice koje označavaju da se potpuno HTTP preusmjeravanje treba izdati pregledniku (R)
i da se ne smiju obrađivati daljnja pravila:
Obratite pažnju na to kako adresna traka sada prikazuje index.html
, kao što je i očekivano, umjesto default.aspx
kao ranije.
Sažetak
U ovom smo članku objasnili kako koristiti mod_rewrite za izvođenje internog preusmjeravanja. Očekujte sljedeći post u kojem ćemo naučiti kako preusmjeriti na resurs koji je premješten na drugi poslužitelj i kako prikazati prilagođeni sadržaj na temelju preglednika korisnika. Do tada, pogledajte dokumente Apache 2.4 za potpuni popis dostupnih zastavica za prepisivanje.
Kao i uvijek, slobodno upotrijebite obrazac za komentare u nastavku ako imate pitanja ili povratnih informacija o ovom članku. Radujemo se vašem odgovoru!