Apache RewriteRule slashes afvangen werkt niet zoals gewenst

Pagina: 1
Acties:

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Topicstarter
Mijn website draait op Apache 1.3.33 @ Windows 2000 Server en ik wil graag backslashes en geneste forward slashes uit de URI slopen, omdat deze vervelende gevolgen kunnen hebben. Ik heb o.a. de volgende RewriteRule in de httpd.conf zitten:
code:
1
2
RewriteRule ^(.*)\\+(.*)$ $1/$2 [R=301,L]
RewriteRule ^(.*)//+(.*)$ $1/$2 [R=301,L]
Werkt allemaal prima, echter in de logs zie ik bijvoorbeeld dat de \\+ en //+ niet meerdere slashes vervangen, maar slechts één tegelijkertijd.

Bijvoorbeeld: http://balusc.xs4all.nl/\/\\//\\\///
Levert op:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2006-10-30 21:51:48 10.0.0.152 - 301 + "GET /\\/\\\\//\\\\\\///" 335 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:48 10.0.0.152 - 301 + "GET /\\/\\\\//\\\\////" 333 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:48 10.0.0.152 - 301 + "GET /\\/\\\\//\\/////" 331 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:48 10.0.0.152 - 301 + "GET /\\/\\\\////////" 329 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:48 10.0.0.152 - 301 + "GET /\\/\\/////////" 327 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:48 10.0.0.152 - 301 + "GET /\\///////////" 325 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:48 10.0.0.152 - 200 + "GET /////////////" 5 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:48 10.0.0.152 - 301 + "GET /////////////srv/wel.html" 336 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:48 10.0.0.152 - 301 + "GET ////////////srv/wel.html" 335 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:48 10.0.0.152 - 301 + "GET ///////////srv/wel.html" 334 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:49 10.0.0.152 - 301 + "GET //////////srv/wel.html" 333 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:49 10.0.0.152 - 301 + "GET /////////srv/wel.html" 332 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:49 10.0.0.152 - 301 + "GET ////////srv/wel.html" 331 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:49 10.0.0.152 - 301 + "GET ///////srv/wel.html" 330 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:49 10.0.0.152 - 301 + "GET //////srv/wel.html" 329 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:49 10.0.0.152 - 301 + "GET /////srv/wel.html" 328 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:49 10.0.0.152 - 301 + "GET ////srv/wel.html" 327 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:49 10.0.0.152 - 301 + "GET ///srv/wel.html" 326 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -
2006-10-30 21:51:49 10.0.0.152 - 301 + "GET //srv/wel.html" 325 0 "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1) Gecko/20061010 Firefox/2.0" -


Dit komt dus doordat de (.*) blijkbaar een hogere prioriteit heeft dan \\+ en //+. Ik verwachtte eigenlijk dat de regexp gewoon van links naar rechts wordt gelezen. Hoe kan ik dit het beste afvangen? Ik heb bijvoorbeeld dit geprobeerd:
code:
1
2
RewriteRule ^(.*)(\\*)?\\+(\\*)?(.*)$ $1/$4 [R=301,L]
RewriteRule ^(.*)(/*)?//+(/*)?(.*)$ $1/$4 [R=301,L]
Maar dit levert hetzelfde resultaat op :/

edit:
Nog even ter verduidelijking, dit is wat ik wil:
\+ moet / worden.
//+ moet / worden.
En dat allemaal in 1 cycle.

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Topicstarter
Mag ik gezien de afwezigheid van de reacties ervan uitgaan dat dit niet mogelijk is? :)

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Topicstarter
OK. * BalusC waagt maar een poging in NOS.

Windows Servers en Server-software » Non-Windows Operating Systems

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Ik denk dat je twee verschillende problemen hebt, maar met dezelfde oorzaak. Allereerst heb je het stuk tot en met de HTTP 200 melding. Dat is waar je eerste regexp de enige is die wat uitvoert, omdat je de L-modifier opgeeft. Je tweede komt pas daarna, als alle backslashes weg zijn, aan de beurt. Vervolgens is er nog het feit dat er maar één slash per keer verwijderd wordt, wat er volgens mij aan ligt dat je regexp greedy is. (.*)/(.*) matcht volgens mij ook op //////////index.html, en wel op deze manier: (/////////)/(index.html). Volgens mij kom je een heel stuk verder als je de L-modifier bij je bovenste regexp bovenaan in je post weglaat, en in beide regexps expliciet controleert op alle karakters behalve de slash die je erna verwacht. .* moet dus [^/] worden, bijvoorbeeld. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Topicstarter
Ik wilde hiermee eigenlijk de volgende voorbeeldscenario's kunnen verwerken:

balusc.xs4all.nl\srv\wel.html
balusc.xs4all.nl/srv//wel.html
balusc.xs4all.nl/\srv\/wel.html
balusc.xs4all.nl/srv/\wel.html
balusc.xs4all.nl//srv\\wel.html

En dus niet alleen maar vanuit de root :)

  • frim
  • Registratie: Augustus 2001
  • Niet online
Ik weet niet of apache conservative matching support, maar anders kun je (.*?) proberen ipv (.*) om zo min mogelijk te matchen.

Verder zou ik ipv twee regexes eenmaal [\/]{2,} gebruiken.

EDIT: Ik denk trouwens dat het sowieso niet mogelijk, of anders heel moeilijk, is om iets als //hoi////hallo\\\hey in 1x te vervangen door /hoi/hallo/hey, aangezien de hele url vervangen wordt door apache. Als alleen het gematchte werd vervangen, zou je aan '[\/]{2,} /' genoeg hebben gehad.

[ Voor 44% gewijzigd door frim op 06-11-2006 17:20 ]

Pagina: 1