Avatar billede elskermad.dk Nybegynder
01. juli 2005 - 23:22 Der er 2 kommentarer og
2 løsninger

mod_rewrite - skjule dynamisk adressering

hej eksperter!

jeg kunne godt tænke mig at skjule at mit site er dynamisk (giver vist bedre rank i forskellige søgemaskiner, og ser lidt mere prof ud ;)

jeg har læst mig til at man skal bruge noget mod_rewrite, men jeg har ingen ide om hvordan det virker :S

jeg har brug for at nedenstående bliver så når man skriver første adresse i adresselinien, så er det i stedet for det andet link den peger hen på:

www.mitdomæne.dk/shop/kategori/4243/oversigt.htm
www.mitdomæne.dk/shop/kat.php?id=4243

den skal meget gerne virke ligemeget hvad man skriver som htm-fil, altså oversigt.htm kunne lige så godt hedde blabla.htm, og hvis man ikke skriver et filnavn skal det stadig virke...

en tredje ting er at der hvis adressen har en ? efter sig så skal det gerne flyttes med... altså som følgende:
www.mitdomæne.dk/shop/kategori/4243/oversigt.htm?bla=blabla&bla2=bla
www.mitdomæne.dk/shop/kat.php?id=4243&bla=blabla&bla2=bla

Hvad skal der gøres for at det kan virke?

På forhånd mange tak :)
Avatar billede mccookie Seniormester
02. juli 2005 - 00:02 #1
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
Avatar billede mccookie Seniormester
02. juli 2005 - 00:04 #2
Del 2:

Modul rewrite eksempler
I Venstres Ungdom har alle lokalforeninger en adresse som fx. http://vu.dk/odense/.

Til at styre det, skal der være en administratorside, hvor det skal være muligt, at oprette nye samt vedligeholde
gamle adresser.

PHP kører som brugeren nobody, og har ikke rettigheder til at oprette biblioteker, eller ændre i dem. Man kunne
selvfølgelig give brugeren de nødvendige rettigheder, men det er en lidt besværlig metode. Derfor ville jeg prøve
at lave noget Rewrite kung-foo der, checkede om filen/biblioteket hente fandtes eller ej - gjorde
den ikke kaldes der et script med det ønskede bibliotek/filnavn som argument. Løsningen var:




  RewriteEngine on
  RewriteCond %{REQUEST_FILENAME} !-F
  RewriteRule ^([^/]+)/?$ /redir.php?forening=$1



Ovenstående checker om REQUEST_FILENAME findes eller ej, gør den ikke vises
/redir.php?forening=odense - hvis
man altså prøvede at henter http://vu.dk/odense/

Efterfølgende skal man så sørge for, at redir.php så sender videre til den rigtige adresse, og at den opfører
sig rigtigt hvis lokalforeningen ikke findes.



På mbn.dk ville jeg gerne have mine sider til at virke statiske selv om de alle er dynamisk genereret. Det skulle også
være muligt, at indele siderne i kategorier. Til formålet brugte jeg:



  RewriteEngine on
  RewriteCond %{REQUEST_FILENAME} !-F
  RewriteRule ^([^/]+)/([^/]*)/?$ /?katid=$1&id=$2



Går man ind på http://mbn.dk/foo/bar/ vil Apache så vise
http://mbn.dk/?katid=foo&id=bar. Med mindre at filen/biblioteket findes.



Jeg ville have at hvis en URL lignede http://host/abc/123/, så skulle
Apache sende videre til /personer.php?person=abc&id=123, men kun hvis abc var
med små bogstaver. De sidste tal var valgfri. Hvis abc indeholdte store bogstaver, skulle
Apache sende videre til /index.php?type=Abc. Jeg brugte:



  RewriteEngine On

  RewriteCond %{REQUEST_FILENAME} !-F
  RewriteRule ^([a-z]+)/?([0-9]*)/?$ /personer.php?person=$1&id=$2 [L]

  RewriteCond %{REQUEST_FILENAME} !-F
  RewriteRule ^([a-z_]+)/?$ /index.php?type=$1 [NC]





Jeg var lidt træt af, at forskellige søgemaskiner indeholdte en masse gengangere af mine sider
fordi de havde fundet underdomæner til mbn.dk, der alle pegede på mbn.dk. Fx. var
www.mbn.dk, ww.mbn.dk og mbn.dk det samme, men alligevel blev de vist som tre selvstændige sider
i Google... jeg smed nedenstående ind i min .htaccess, og nu er det kun mbn.dk der virker.



  RewriteEngine On
  RewriteCond %{HTTP_HOST} !^mbn.dk$
  RewriteRule ^(.*) http://mbn.dk/$1 [L,R=301]





Nogle editorer opretter en backup af filen man lige har gemt. Sidder man
og redigerer sider direkte på serveren kan det bevirker, at hvis man gemmer
filen hemmelig.php, så opretter editoren en fil ved navn
hemmelig.php~ der ikke vil blive fortolket som værende PHP.
For at nægte folk adgang til filer der ender på ~, kan
følgende bruges:



  RewriteEngine On
  RewriteRule ^.*~$ - [F]



Til smartlog.dk havde jeg brug for at sende whatever.smartlog.dk videre til /home/smartlog/blog_files/?host=whatever. Det gjorde jeg på følgende måde:



  RewriteEngine on
  RewriteCond  %{HTTP_HOST}  !^(www.)?smartlog.dk$
  RewriteCond  %{HTTP_HOST}  ^(www.)?[^.]+.smartlog.dk$
  RewriteRule  ^(.+)        %{HTTP_HOST}$1                [C]
  RewriteRule  ^(www.)?([^.]+).smartlog.dk /home/smartlog/blog_files/?host=$2




Husk: hvis du selv vil lave dine rewriterules så check for
sikkerhedshuller.
Samt andre gode råd:




Are your mod_rewrite rules doing what you expect?

RE: Are your mod_rewrite rules doing what you expect?
Avatar billede mccookie Seniormester
02. juli 2005 - 00:04 #3
Jeg håber disse 2 artikler kan hjælpe dig ;)=

De er hentet fra www.MBN.dk som har nogle rigtige fede artikler/vejledninger ;)

Mvh.
McCookie
Avatar billede elskermad.dk Nybegynder
02. juli 2005 - 13:53 #4
jeg kan ikke få det til at virke - jeg har ingen forstand på de reg.exp. og heller ikke hvordan jeg sætter det op?

jeg har fjernet havelågerne ud fra de steder hvor mod_rewrite er beskrivet i apache-config-filen og genstartet, og oprettet en .htaccess-fil som er lagt i roden af mit site med følgende indhold:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-F
RewriteRule ^([^/]+)/([^/]*)/([^/]*)/([^/]*)/?$ /shop/kat.php?id=$4

den skal gerne sende fra a til b
a: http://mitsite.dk/shop/kategori/spritus/12/
b: http://mitsite.dk/shop/kat.php?id=12
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Uanset kodesprog, så giver vi dig mulighederne for at udvikle det, du behøver.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester