Del 1:
Modul rewrite
Modul rewrite er et advanceret modul til Apache webserveren. Med modulet er det muligt, at opsætte nogle regler for hvordan ens adresser skal se ud. Alle kommandoer jeg kommer med, skal skrives i din .htaccess
Et typisk eksempel vil være, at man gerne vil skjule, at man bruger dynamiske adresser. Nogle søgemaskiner undlader at indeksere sider der indeholder spørgsmålstegn i adressen.
Lad of sige at vi har adresser som
http://host/?id=5. Det vil vi have lavet om til
http://host/5/.Først skal vi fortælle serveren, at den skal starte rewritemaskinen, dette gøres ved at skrive nedenstående linie i .htaccess
RewriteEngine on
Derefter skal vi sikre os, at hvis der findes et bibliotek ved navn 5, så skal vi ikke sende brugeren videre til /?id=5.
RewriteCond %{REQUEST_FILENAME} !-F
RewriteCond betyder rewrite condition, og hvis betingelsen er opfyldt, vil Apache udføre den RewriteRule der kommer efter.
Næste punkt er, at lave den regl som serveren kan sende videre med.
Nedenstående fanger alle adresser der starter med et eller flere tal, og slutter med en skråstreg. Fordi [0-9]+ er inde i en parantes, vil Apache betrægte det som første gruppering, og tildele indholdet $1. Det sidste punkt i linien er filen der skal sendes videre til, hvor $1 så vil indeholde et femtal.
RewriteRule ^([0-9]+)/$ /?id=$1
RewriteCond
RewriteCond er en slags if-sætning i mod_write'sk. Hvis dens betingelse retunerer sand vil den efterfølgende RewriteRule blive udført.
Når man bruger variabler, skal de være i formen %{FOO}. Man kan bruge følgende variable:
HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_FORWARDED, HTTP_HOST, HTTP_PROXY_CONNECTION HTTP_ACCEPT, REMOTE_ADDR, REMOTE_HOST, REMOTE_USER, REMOTE_IDENT, REQUEST_METHOD, SCRIPT_FILENAME PATH_INFO, QUERY_STRING, AUTH_TYPE, DOCUMENT_ROOT, SERVER_ADMIN, SERVER_NAME, SERVER_ADDR SERVER_PORT, SERVER_PROTOCOL, SERVER_SOFTWARE, TIME_YEAR, TIME_MON, TIME_DAY, TIME_HOUR, TIME_MIN TIME_SEC, TIME_WDAY, TIME, API_VERSION, THE_REQUEST, REQUEST_URI, REQUEST_FILENAME, IS_SUBREQ.
Variablernes indhold forklarer bedst hvad de indholder, så det underlader jeg at gøre :)
På de variabler kan man lave forskellige checks.
Lad os antage, at vi har et bibliotek med følgende filer: formiddag.html, eftermiddag.html, aften.html og nat.html når "tiden er inde" skal serveren selv finde ud af, at vise den rigtige fil. Er klokken fx. 21.39 skal brugeren se indholdet af aften.html osv...
Tilføjer man et [L] på sin RewriteRule vil serveren ikke kigge på flere regler, eller betingelser hvis den RewriteRule den står ved bliver udført. Af andre der kan tilføjes kan nævnes:
NC: No Case, dvs. der er ikke forskel på store og små bogstaver.
T=MIME-Type: Hvor MIME-Type er den MIME-Type der skal tilføjes.
R=Statuskode: Hvor statuskode er den statuskode som serveren skal returnere. Fx. 302 for Moved Temporarily.
Tilføjes flere, skal de adskilles af et komma.
Så i nedenstående eksempel vil Apache stoppe efter nat.html, hvis klokken er over 22.
RewriteEngine On
# Hvis klokken er 22 eller over...
RewriteCond %{TIME_HOUR} >22 [OR]
RewriteCond %{TIME_HOUR} =22
RewriteRule .* nat.html [L]
# Hvis klokken er 20 eller over...
RewriteCond %{TIME_HOUR} >20 [OR]
RewriteCond %{TIME_HOUR} =20
RewriteRule .* aften.html [L]
# Hvis klokken er 12 eller over...
RewriteCond %{TIME_HOUR} >12 [OR]
RewriteCond %{TIME_HOUR} =12
RewriteRule .* eftermiddag.html [L]
#Hvis klokken er 6 eller over...
RewriteCond %{TIME_HOUR} >6 [OR]
RewriteCond %{TIME_HOUR} =6
RewriteRule .* formiddag.html
I eksemplet fra før brugte jeg:
RewriteCond %{REQUEST_FILENAME} !-F
REQUEST_FILENAME er navnet på den fil brugeren har prøvet at hente, og -F betyder at filen/biblioteket skal findes. Sætter man et ! foran betyder det lige det modsatte - at filen/biblioteket ikke skal findes...
Følgende kan også bruges til check på filer:
-d: bibliotek
-f: fil
-s: fil der fylder mere en 0 bytes
-l: symbolsklink
-U: gyldig URL
Det gælder også med ovenstående, at de kan kaldes med et ! foran der får deres betydning til at betyde det modsatte.
Man kan selvfølgelig også kigge på variablen via en regular expression. Fx. vil nedenstående vise secret_file.html hvis man kommer fra et 192.168. netværk. Kommer man ikke der fra, vil man se public_file.html.
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^192.168..+
RewriteRule .* secret_file.html [L]
RewriteRule .* public_file.html