PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : URL umschreiben (squid/squidguard)



mamue
12.05.07, 12:50
Hallo,
ich versuche gerade URLs umzuschreiben, vom Muster
.*\.meine-domain\.de:88/.*
nach
.*\.meine-domain\.de:88/opencms/opencms/verzeichnisname/.*
Ich nehme an, dass sich das erste .* als \1 und das zweite .* als \2 schreiben lässt:
\1\.meine-domain\.de:88/opencms/opencms/verzeichnisname/\2

Leider funktioniert das nicht. Die URLs werden anscheinend überhaupt nicht umgeschrieben. So sieht meine squidguard.conf aus:


logdir /var/log/squidGuard
rewrite opencms-rule {
s@((.*)my-dom\.de:8080/)(.*)@\2my-dom\.de:8080/opencms/opencms/\3@i
}
acl {
default {
rewrite opencms-rule
}
}

In der squid.conf steht:


#rewrite
redirect_program /usr/sbin/squidGuard
redirect_children 50

#server acceleration
http_port 88
httpd_accel_host localhost
httpd_accel_port 8080
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

ich dachte, es würde vielleicht erst der Port umgeschrieben (httpd_accel_port) und danach der redirect druchgeführt, aber es scheint keine Rolle zu spielen, ob ich "my-dom\.de:8080/" oder "my-dom\.de:88/" schreibe.
Im access.log von squid steht (http://www.my-dom.de:88/):


TCP_MISS/400 219 GET http://www.my-dom.de:8080/index.html

Was habe ich da falsch gemacht?

Danke
mamue

mamue
13.05.07, 11:11
SquidGuard ist gut für komplexe acl, aber zum einfachen umschreiben der URLs scheint squirm besser geeignet zu sein. Das ist bei weitem nicht so mächtig und im Gegenzug viel übersichtlicher in der Konfiguration. Erste Erfolge gibt es, und ich verzichte jetzt mal darauf, die Domain-Namen umzuschreiben:


regexi ^http://tanzsport-emden\.de:8080/(.*$) http://tanzsport-emden.de:8080/opencms/opencms/tanzsport-emden/\1 ^http://tanzsport-emden.

regexi ^http://www\.tanzsport-emden\.de:8080/(.*$) http://www.tanzsport-emden.de:8080/opencms/opencms/tanzsport-emden/\1 ^http://www.tanzsport-emden.

abort .gif
abort .html
abort .jpg
abort .htm

Zunächst einmal schreibt also squid den Port um. Squid lauscht auf 88, der accel_host auf 8080 (tomcat). Die Anfragen, die Squirm bekommt, gehen also über Port 8080.
Squirm lässt sich prima über die Kommandozeile testen:
#suirm


#Eingabe:
http://tanzsport-emden.de:8080/test.html 127.0.0.1/- - GET
#Ausgabe von squirm:
http://tanzsport-emden.de:8080/test.html
:http://tanzsport-emden.de:8080/opencms/opencms/tanzsport-emden/test.html

So weit, so gut. Wenn ich allerdings auf der Webseite Links habe, die bereits das "/opencms/opencms/" Prefix haben, geht das natürlich schief, denn das wird zu "/opencms/opencms/opencms/opencms/". Also ändere ich den Ausdruck:


regexi ^http://www\.tanzsport-emden\.de:8080/[^opencms](.*$) http://www.tanzsport-emden.de:8080/opencms/opencms/tanzsport-emden/\1 ^http://www.tanzsport-emden.

Dieser Ausdruck matcht nur, wenn nach "8080/" nicht "opencms" folgt, dachte ich. Aber warum verschluckt der vom Dateinamen den ersten Buchstaben?


http://www.tanzsport-emden.de:8080/test.html
:http://www.tanzsport-emden.de:8080/opencms/opencms/tanzsport-emden/est.html

Aus "test.html" wird "est.html", wieso das?

mamue

P.S.: Sorry, ich glaube, die regex ist Müll. Kann es sein, dass "[^opencms]" alles Matcht, außer "o", "p", ..? Damit würde das erste Zeichen hier verbraucht werden, ich könnte womöglich gruppieren "([^opencms])" und an die URL \1\2 anhängen, aber ich will ja eigentlich, dass dieses Muster nicht matcht, wenn die _Zeichenkette_ "opencms" enthalten ist.

mamue
13.05.07, 17:50
Ich habe das Problem einstweilen auf billige Art und Weise gelöst:


regexi ^http://tanzsport-emden\.de:8080/(.*$) http://tanzsport-emden.de:8080/opencms/opencms/tanzsport-emden/\1 ^http://tanzsport-emden.

regexi ^http://tanzsport-emden\.de:8080/opencms/(.*$) http://tanzsport-emden.de:8080/opencms/\1 ^http://tanzsport-emden.

Da ich dort mehrere Präsenzen liege habe, muß ich derzeit dieses Muster dort oben für jede Site wiederholen.
Sei's drum, es sind zum Glück noch unter hundert ;-)

Ach ja, damit das wirklich funktioniert, muß man squirm etwas patchen, denn der möchte unbedingt alle Netze als Class C-Netz angegeben haben, die darauf zugreifen sollen:
127.0.0
192.168.1
10.2.3
usw.
Im Quelltext steht in squirm.c an einer Stelle die Abfrage, ob die anfragende IP in der Liste steht. Diesen Test auskommentieren und schon geht es.

mamue