Apache: Tilda u web adresi

tildaNedavno je na listi sistemci postavljeno pitanje kako, umjesto klasičnog načina zapisivanja korisničkih stranica pomoću tilde http://www.ustanova.hr/~korisnik/, doći do adrese oblika http://korisnik.ustanova.hr/.

Jedan od odgovora uključivao je RewriteRules i potakao me da pokušam ponuditi jedno od mogućih rješenja problema.

Za početak, potrebno je u DNS-u postaviti DNS wildcard za poddomenu *.ustanova.hr:

*.ustanova.hr.         IN      CNAME           imeposluzitelja

Zatim slijedi preinaka u datoteci httpd.conf:

<VirtualHost 192.168.1.1:80>
ServerName korisnici.ustanova.hr
ServerAlias *.ustanova.hr
DocumentRoot /var/www/korisnici/

UseCanonicalName Off

RewriteEngine on
RewriteLogLevel 1
RewriteLog /var/log/apache/rewrite.log

RewriteCond %{HTTP_host} ^([a-z0-9][-a-z0-9]+)\.ustanova\.hr\.?(:80)?$ [NC]
RewriteCond /home/%1/public_html -d
RewriteRule ^(.*) /home/%1/public_html/$1 [L]
</VirtualHost>

Malo o konfiguraciji liniju po liniju.

Pretpostavka je da u DNS-u imamo zapis korisnici, na adresi 192.168.1.1, koji na poslužitelju gleda u direktorij /var/www/korisnici. Ovdje je to urađeno samo zbog primjera uz pretpostavku da je www.ustanova.hr izdvojen kao zasebni virtualni poslužitelj.

ServerAlias direktiva postavlja alternativno ime poslužitelja na wildcard vrijednost, a direktiva „UseCanonicalName Off“ kaže poslužitelju da za ime koristi ono što mu klijent pošalje (u našem slučaju korisnik.ustanova.hr).

Slijede minimalne postavke za RewriteEngine. RewriteLogLevel može imati vrijednost od 0 do 9, pri čemu je 0-isključeno, a 9 zapisuje svaku akciju. Iako je viša vrijednost dobra za debugiranje i kontrolu rada, u radu se, zbog procesorskog i diskovnog opterećenja, ne preporuča vrijednost veća od 1.

Nakon toga slijede RewriteCond – pravila koja moraju biti zadovoljena kako bi uslijedio RewriteRule. Ovdje se provjerava da li je klijent poslao HTTP_HOST oblika nesto.ustanova.hr te da li u tom slučaju postoji direktorij /home/nesto/public_html. Možda je ovdje dobro napomenuti kako smo se ovako ograničili na klijente koji podržavaju HTTP1/1.

Ukoliko su RewriteCond zadovoljeni, izvršava se RewriteRule koji radi internu redirekciju adrese korisnik.ustanova.hr na direktorij /home/korisnik/public_html. Naravno, ukoliko su korisnički direktoriji negdje drugdje (npr. /home/studenti/korisnik/public_html), potrebno je prilagoditi odgovarajuću putanju do njih.

Ono što bi svakako valjalo napomenuti je da bi, u slučaju implementacije ovakvog ili sličnog rješenja, trebalo paziti na zagađenje imeničkog prostora ustanove. U tom smislu bi možda trebalo razmisliti o uporabi adresa oblika korisnik.nesto.ustanova.hr (npr. pero.web.ustanova.hr ili pero.korisnici.ustanova.hr).

Kuharice: 
Kategorije: 
Vote: 
0
No votes yet

Komentari

sto se desava kad pozovem adresu:
http://mate.ustanova.hr/

a na serveru ne postoji korisnik mate?

oce se prikazat naslovna stranica ustanove ili greska?

pozdrav

Prikazat ce se DocumentRoot.

DocumentRoot /var/www/korisnici/

Upravo zato se i testira da li postoji direktorij /home/mate/public_html. Ukoliko ne postoji, ne izvršava se RewriteRule.

Ukoliko je DocumentRoot ujedno i root direktorij weba ustanove (/var/www), tada će se prikazati naslovnica ustanove. U ovom primjeru je postavljen kao zasebni virtualni poslužitelj. Ukoliko želimo postaviti konfiguraciju u isti virtualni poslužitelj s webom ustanove tada bi, primjerice, mogli pisati:

    ServerName www.ustanova.hr
ServerAlias *.ustanova.hr
DocumentRoot /var/www/
...

U ovom slučaju bi se, ako ne postoji korisnik mate, prikazao web ustanove.