[apache/mod_rewrite]Trailing slash teruggeven aan de browser

Pagina: 1
Acties:

  • NLChris
  • Registratie: Juli 2004
  • Laatst online: 16-05 21:05
Na al die maanden rond te snuffelen op GoT mijn eerste post.

Ik ben een beetje aan het prutsen met mod_rewrite onder apache2, debian. Aan mijn virtualhost (/etc/apache2/sites-enabled/default) heb ik dit veranderd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
NameVirtualHost *
<VirtualHost *>
...
    <Directory /var/www/ib/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        allow from all
        RewriteEngine On
        
        
        #Stylesheets en images corrigeren
        RewriteRule     ^(.*)/style/(.*)    style/$2
        RewriteRule     ^(.*)/images/(.*)   images/$2
        
        RewriteCond     %{REQUEST_URI}          !^.*/style/.*$
        RewriteCond     %{REQUEST_URI}          !^.*/images/.*$
        RewriteCond %{REQUEST_FILENAME} !(.*).php
        #Slash aan het einde toevoegen
        RewriteRule     (.*)([a-z])$            $1$2/ #[R] heb ik ook al geprobeerd
        RewriteRule     (.*)/$          index.php?id=$1     [L] 
    </Directory>
...
</VirtualHost>


Nu werkt dit prima, als ik http://localhost/ib/foo of http://localhost/ib/foo/ invul wordt dit allebei netjes veranderd tot http://localhost/ib/index.php?id=foo/. Die id explode ik dan in php, zodat hij te gebruiken is.
offtopic:
Ik weet dat het waarschijnlijk makkelijker is met MultiViews, maar af en toe wil je wat leren :)

Het probleem is dat als ik in een browser http://localhost/ib/foo intik ik goed terecht kom, maar dat de links niet goed meer werken. Want de browser ziet foo als bestand niet als map. Nu is mijn vraag hoe ik een trailing slash kan 'terugzenden' naar de browser. Ik heb al gezocht op google, apache.org en natuurlijk GoT, maar ik kon geen echt antwoord vinden.

Alvast bedankt voor het lezen _/-\o_

  • NLChris
  • Registratie: Juli 2004
  • Laatst online: 16-05 21:05
* kick *

  • semicolon
  • Registratie: Mei 2004
  • Niet online
code:
1
2
RewriteCond ${REQUEST_FILENAME}  !-f
RewriteCond ${REQUEST_FILENAME}  !-d

of iets dergelijks toevoegen?
# '-d' (is directory)
Treats the TestString as a pathname and tests if it exists and is a directory.
# '-f' (is regular file)
Treats the TestString as a pathname and tests if it exists and is a regular file.
bron: apache handleiding

:D/-<


  • Sendy
  • Registratie: September 2001
  • Niet online
Je moet een redirect doen naar de juiste URL (met slash). Daarna moet je alleen de URL met slash rewriten, zodat je PHP gewoon werkt.

edit:

Dus zoals in je regel 20, maar daar is de [R] uitgecommentarieerd. Waarom werkte dat niet?
Trouwens, ik heb geen praktische ervaring met mod_rewrite, ik doe de rewrite met (blijkbaar) mod_alias.

[ Voor 45% gewijzigd door Sendy op 28-12-2004 19:42 ]


  • NLChris
  • Registratie: Juli 2004
  • Laatst online: 16-05 21:05
Sendy schreef op dinsdag 28 december 2004 @ 19:38:
Je moet een redirect doen naar de juiste URL (met slash). Daarna moet je alleen de URL met slash rewriten, zodat je PHP gewoon werkt.

edit:

Dus zoals in je regel 20, maar daar is de [R] uitgecommentarieerd. Waarom werkte dat niet?
Trouwens, ik heb geen praktische ervaring met mod_rewrite, ik doe de rewrite met (blijkbaar) mod_alias.
Als ik de [R] optie laat staan (en dus een 'L' optie toevoeg) wordt ik verkeerd omgeleid. Mijn DocumentRoot is /var/www/ daarin staat dus de map 'ib'. Als ik in mijn browser naar http://localhost/ib/foo ga wordt dit meegegeven aan index.php:

index.php?&id=http://localhost/var/www/ib/foo/

Dit moet dus omgeleid worden naar http://localhost/ib/foo/ en dus achter de schermen naar http://localhost/ib/index.php?&id=foo/

Een stukje uit mijn rewrite-log:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[per-dir /var/www/ib/] strip per-dir prefix: /var/www/ib/landen -> landen
[per-dir /var/www/ib/] applying pattern '^(.*)/style/(.*)' to uri 'landen'
[per-dir /var/www/ib/] strip per-dir prefix: /var/www/ib/landen -> landen
[per-dir /var/www/ib/] applying pattern '^(.*)/images/(.*)' to uri 'landen'
[per-dir /var/www/ib/] strip per-dir prefix: /var/www/ib/landen -> landen
[per-dir /var/www/ib/] applying pattern '(.*)([a-z])$' to uri 'landen'
RewriteCond: input='/ib/landen' pattern='!^.*/style/.*$' => matched
RewriteCond: input='/ib/landen' pattern='!^.*/images/.*$' => matched
RewriteCond: input='/var/www/ib/landen' pattern='!(.*).php' => matched
[per-dir /var/www/ib/] rewrite landen -> landen/
[per-dir /var/www/ib/] add per-dir prefix: landen/ -> /var/www/ib/landen/
[per-dir /var/www/ib/] explicitly forcing redirect with http://localhost/var/www/ib/landen/
[per-dir /var/www/ib/] applying pattern '(.*)/$' to uri 'http://localhost/var/www/ib/landen/'
[per-dir /var/www/ib/] rewrite http://localhost/var/www/ib/landen/ -> 
               index.php?id=http://localhost/var/www/ib/landen/


Het gaat fout bij regel 11 waar hij 'landen' weer omzet naar de 'fysieke' locatie /var/www/ib/landen/.
ik weet alleen niet waarom. :?
Max v W schreef op dinsdag 28 december 2004 @ 19:37:
code:
1
2
RewriteCond ${REQUEST_FILENAME}  !-f
RewriteCond ${REQUEST_FILENAME}  !-d

of iets dergelijks toevoegen?
Ik snap het eerlijk niet helemaal, ik heb het geprobeerd maar zonder resultaat (kan aan mij liggen :) )

Alvast bedankt voor t meedenken _/-\o_ GoT heeft de beste fora en de beste experts die ik ooit gezien heb _/-\o_

edit:
Ik heb na mijn post ff helder nagedacht en de oplossing gevonden
, eigenlijk best logisch.Dat ik hier niet eerder aan dacht 8)7 8)7.:
code:
1
2
3
4
5
6
7
8
9
10
#Stylesheets en images corrigeren
        RewriteRule     ^(.*)/style/(.*)    style/$2
        RewriteRule     ^(.*)/images/(.*)   images/$2
        
        RewriteCond     %{REQUEST_URI}          !^.*/style/.*$
        RewriteCond     %{REQUEST_URI}          !^.*/images/.*$
        RewriteCond %{REQUEST_FILENAME} !(.*).php
        #Slash aan het einde toevoegen
        RewriteRule     (.*)([a-z])$            http://%{SERVER_ADDR}/ib/$1$2/      [R,L]
        RewriteRule     (.*)/$          index.php?id=$1/


toch nog bedankt _/-\o_

[ Voor 16% gewijzigd door NLChris op 28-12-2004 20:38 ]


  • semicolon
  • Registratie: Mei 2004
  • Niet online
NLChris schreef op dinsdag 28 december 2004 @ 20:21:
[...]

Ik snap het eerlijk niet helemaal, ik heb het geprobeerd maar zonder resultaat (kan aan mij liggen :) )
Wat deze condities doen, is kijken of er een map is met de naam die je opgeeft, en de -f kijkt of er een bestand is. Als die NIET bestaat, gaat ie verder met je rewrite..

Je kunt ook kijken of het misschien wel werkt met %{REQUEST_URI}, dit is dus bijvoorbeeld:
/foo
waarbij REQUEST_FILENAME, het gehele pad zou moeten zijn. Dus bv.
/home/user/public_html/foo

De volgende opties zijn aan te raden om te bekijken of ze wel/niet bestaan, bij zulke rewrites:
-f Kijkt of het bestaat, en een normaal bestand is.
-d kijkt of het bestaat, en het een directory is.
-l kijkt of het bestaat, en een symbolic link is.

Althans zo begrijp ik het uit de Apache handleiding.
Dus dan zou je zoiets krijgen (niet getest):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        #Stylesheets en images corrigeren
        RewriteRule     ^(.*)/style/(.*)     style/$2
        RewriteRule     ^(.*)/images/(.*)     images/$2
        
        RewriteCond     %{REQUEST_URI}          !^.*/style/.*$
        RewriteCond     %{REQUEST_URI}          !^.*/images/.*$
        RewriteCond     %{REQUEST_FILENAME}     !(.*).php
    RewriteCond     %{REQUEST_FILENAME}     !-f
    RewriteCond     %{REQUEST_FILENAME}     !-F
    RewriteCond     %{REQUEST_FILENAME}     !-d
    RewriteCond     %{REQUEST_FILENAME}     !-l
        #Slash aan het einde toevoegen
        RewriteRule     (.*)([a-z])$            $1$2/ #[R] heb ik ook al geprobeerd
        RewriteRule     (.*)/$             index.php?id=$1        [L]

:D/-<


  • Sendy
  • Registratie: September 2001
  • Niet online
Ik denk misschien een klein foutje ergens. Alleen kan ik je daarmee niet helpen. Lees nog eens goed de handleiding na, en zoek naar de tekst op regel 11 en 12 van de logs op Google.

  • NLChris
  • Registratie: Juli 2004
  • Laatst online: 16-05 21:05
oeps... had jullie berichten niet meer gezien, maar het probleem is ondertussen opgelost.
Max v W en Sendy nogmaals bedankt voor de uitleg _/-\o_
Pagina: 1