mboost-dp1

Problemer med mod_rewrite (.htaccess)


Gå til bund
Gravatar #1 - Jace
6. dec. 2009 01:12
Heay,

Jeg er ikke den store haj til mod_rewrite, så jeg har været rundt på nettet og finde lidt scripts som jeg kunne bruge. Jeg har også fået det til at virke, på nær en ting. Det script jeg har fundet (de sidste to linjer) har til formål at redirecte til adressen med www foran hvis man går ind på siden uden www foran.

Mit script ser således ud:

Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteRule ([0-9]*)/$ post.php?id=$1
RewriteCond %{HTTP_HOST} !^www\.jacobworsoe\.dk$ [NC]
RewriteRule ^(.*)$ http://www.jacobworsoe.dk/$1 [R=301,L]

Jeg har deaktiveret koden på siden lige nu, men problemet er at hvis man går ind på f.eks. http://jacobworsoe.dk/overskrift-til-indlaegget-12... så så bliver man redirected til: http://www.jacobworsoe.dk/post.php/?id=12 (som giver en 404)

Er der en der kan gennemskue hvordan man kan rette scriptet, så den beholder den re-writede URL og nøjes med at putte et www foran?

Jeg kan lige tilføje at det virker perfekt på forsiden. Altså hvis man går ind på http://jacobworsoe.dk så bliver man redirected til http://www.jacobworsoe.dk - præcis som man skal :)
Gravatar #2 - zin
6. dec. 2009 01:35
Har du prøvet at sætte et \ bag spørgsmålstegnet i din første RewriteRule? Så vidt jeg kan forstå benytter denne sig af REGEXP, og der er ? en "funktion", så det kan være du skal lave en escapecharacter.
Jeg er for træt til det her p.t., skal det siges. :-(
Gravatar #3 - kasperd
6. dec. 2009 09:32
Jeg vil ummidelbart tro problemet er med
([0-9]*)/$
Det matcher et vilkårligt antal cifre efterfulgt af en skråstreg. Et vilkårligt antal cifre kan også være nul cifre, så faktisk matcher du alle URLer der ender med /.

Hvis du ønsker at matche et positivt tal er den smarteste måde at gøre det på ofte med [1-9][0-9]*, hvilket betyder at der skal være mindst et ciffer, og det første ciffer må ikke være nul. Desuden tror jeg du burde starte dit udtryk med ^, så hele URLen skal matche.

Så, jeg tror du burde have noget i retning af
^/([1-9][0-9]*)/$
Men jeg ved ikke om RewriteBase ændrer på hvordan udtrykket skal se ud, jeg har aldrig brugt RewriteBase.
Gravatar #4 - T-Hawk
6. dec. 2009 10:12
kasperd (3) skrev:
Hvis du ønsker at matche et positivt tal er den smarteste måde at gøre det på ofte med [1-9][0-9]*, hvilket betyder at der skal være mindst et ciffer, og det første ciffer må ikke være nul.

Da han havde brugt intervallet [0-9] tillader jeg mig at antage at han ønsker at tallet kan være 0, han kan derfor (hvis mod_rewrite understøtter det) bruge [0-9]+, som betyder 1 eller flere. Hvis dette ikke er understøttet er det semantisk det samme som [0-9][0-9]* som igen matcher mindst et tal.

Resten af dine pointer er jeg enig i
Gravatar #5 - kasperd
6. dec. 2009 10:34
T-Hawk (4) skrev:
Da han havde brugt intervallet [0-9] tillader jeg mig at antage at han ønsker at tallet kan være 0
Nu stod der jo [0-9]*, hvilket f.eks. matcher 10. Man har tit en situation hvor man gerne vil matche 10 men ikke 01. Hvis man ønsker at matche 0 men ikke 01, så bliver udtrykket mere compliceret. Der er naturligvis også mange tilfælde hvor man er ligeglad med om den slags grænsetilfælde matcher eller ej. Man skal bare gøre sig klart, om man ønsker at de matcher.

(hvis mod_rewrite understøtter det) bruge [0-9]+
Sandsynligvis understøttes det, muligvis skal det skrives som [0-9]\+, det er forskelligt hvornår + skal escapes, og hvornår det ikke skal.
Gravatar #6 - Jace
6. dec. 2009 12:19
Mange tak for jeres svar. Jeg vil lige prøve det i aften når der forhåbentlig ikke er nogen på siden. Jeg har ikke lige fået lavet et sted jeg kan teste ændringerne, så jeg er nødt til at lave det direkte på siden.

Jeg kan sagtens se hvad I mener, men er problemet ikke at den ikke kalder den "pæne" URL men istedet den rigtige.

Altså at den kalder:
http://www.jacobworsoe.dk/post.php/?id=12

Når den burde kalde:
http://www.jacobworsoe.dk/overskrift-til-indlaegge...
Gravatar #7 - zin
6. dec. 2009 16:26
#6: Tjo, men overskriften bliver ikke vidersendt i PHP så vidt jeg husker - så du er "nødt" til at redirecte til post.php?id=xx før du kan få den videre (igen) til overskrift-til-post-nr.12. :-)
Gravatar #8 - Corholio
6. dec. 2009 16:30
Jace (6) skrev:
Mange tak for jeres svar. Jeg vil lige prøve det i aften når der forhåbentlig ikke er nogen på siden. Jeg har ikke lige fået lavet et sted jeg kan teste ændringerne, så jeg er nødt til at lave det direkte på siden.


Jeg vil foreslå dig at lave ændringer til dit site i et udviklingsmiljø du kører lokalt på din egen computer. Jeg kan varmt anbefale XAMPP - http://www.apachefriends.org/en/xampp.html

Når du så har tingene udviklet færdigt uploader du tingene til din host.
Gravatar #9 - Jace
6. dec. 2009 20:50
Så er problemet løst. Jeg fik (endelig) svar fra ham der havde lavet scriptet og det virkede sku at bytte lidt om på rækkefølgen. Så nu ser det således ud:

RewriteEngine on
RewriteBase /
Options +FollowSymLinks
RewriteCond %{HTTP_HOST} !^www\.jacobworsoe\.dk$ [NC]
RewriteRule ^(.*)$ http://www.jacobworsoe.dk/$1 [R=301,L]
RewriteRule ([0-9]+)/$ post.php?id=$1

Forresten stor tak for at påpege fejlen med at bruge * istedet for +... Jeg prøvede mig lidt frem med nogle af de forslag i kom med og fik det til at virke med ovenstående kode.

Det er super fedt at f.eks. denne adresse giver en 404 nu:
http://www.jacobworsoe.dk/koer-en-test-paa-tvaers-...

Er der også en der ved hvordan man kan få den til at returnere en 404 hvis man f.eks. indtaster et id som ikke findes i databasen, f.eks. id=9999 som her:
http://www.jacobworsoe.dk/test-9999/

Jeg har prøvet med denne kode, men det virker ikke helt:
if($rows == 0) { HEADER("Location: http://www.jacobworsoe.dk/notfound.php"); } ELSE {

(notfound.php findes ikke på serveren) men det giver vist ikke en helt ægte 404 i forhold til f.eks. Google :)
Gravatar #10 - Jace
6. dec. 2009 21:48
Corholio (8) skrev:
Jeg vil foreslå dig at lave ændringer til dit site i et udviklingsmiljø du kører lokalt på din egen computer. Jeg kan varmt anbefale XAMPP - http://www.apachefriends.org/en/xampp.html

Når du så har tingene udviklet færdigt uploader du tingene til din host.

Og mange tak for det foreslag. Det er allerede sat op :)
Gravatar #11 - arne_v
6. dec. 2009 22:25
#8 & 10

Generelt har jeg meget svært ved at se pointen i der Apache+PHP+MySQL bundler.

1) Hvis ikke man kan installere Apache, PHP og MySQL separat så tvivler jeg på at ens applikation er noget værd.

2) Ved at installere selv og forstå opsætningen er man langt bedre udrustet til at troubleshoote eventuelle problemer.
Gravatar #12 - T-Hawk
7. dec. 2009 06:13
Jace (9) skrev:
Er der også en der ved hvordan man kan få den til at returnere en 404 hvis man f.eks. indtaster et id som ikke findes i databasen, f.eks. id=9999 som her:
http://www.jacobworsoe.dk/test-9999/

Jeg har prøvet med denne kode, men det virker ikke helt:
if($rows == 0) { HEADER("Location: http://www.jacobworsoe.dk/notfound.php"); } ELSE {

(notfound.php findes ikke på serveren) men det giver vist ikke en helt ægte 404 i forhold til f.eks. Google :)

Hvorfor giver det ikke en "ægte" 404? Men du kan jo lade den redirecte til din fejl-side, som du så kan lade sætte response code 404:
header("HTTP/1.0 404 Not Found");
Gravatar #13 - Corholio
7. dec. 2009 13:53
arne_v (11) skrev:

1) Hvis ikke man kan installere Apache, PHP og MySQL separat så tvivler jeg på at ens applikation er noget værd.


At konfigurere et hosting setup har sjældent noget at gøre med værdien af en applikation. Det har (som du selv nævner) altid været en god ide at ha' kendskab til sit hosting setup, men det er langt fra en nødvendighed.

arne_v (11) skrev:

2) Ved at installere selv og forstå opsætningen er man langt bedre udrustet til at troubleshoote eventuelle problemer.


Sandt, men i visse tilfælde har man alligevel ikke adgang til opsætningen af server-apps (webhoteller, etc). Så kan det være ligegyldigt med den viden. Jeg ville ikke investere i en dedikeret maskine til min personlige hjemmeside (det er for dyrt i hosting), så hellere bruge en 20-50 kr's (pr/mnd) ting.
Gravatar #14 - arne_v
13. dec. 2009 22:58
Corholio (13) skrev:
At konfigurere et hosting setup har sjældent noget at gøre med værdien af en applikation.


Hvis evnerne ikke rækker til at konfigurere de nævnte servere, så rækker evnerne næppe heller til at lave en god web app.

Corholio (13) skrev:
Sandt, men i visse tilfælde har man alligevel ikke adgang til opsætningen af server-apps (webhoteller, etc). Så kan det være ligegyldigt med den viden.


Selvom man ikke har adgang til at ændre dem kan man skam godt have stor nytte af at vide at de eksisterer.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login