Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Apache Rewrite Problem

4 views
Skip to first unread message

Stefan Dreyer

unread,
Dec 13, 2011, 4:53:20 AM12/13/11
to
Hallo,

ich verzweifele gerade mit folgendem Rewrite Problem.

Ich möchte gerne folgende URLs umschreiben:

http://vhost.domain.example/upload/image/11.jpg

in

http://vhost.domain.example/upload/vhost/image/11.jpg

Wobei vhost ein Wildcard ist, dass heißt eine beliebige Subdomain sein kann.
Das habe ich mal probiert:

RewriteCond %{HTTP_HOST} ^[a-z0-9\-]+\.domain\.example$
RewriteRule upload/(.*) %{HTTP_HOST}/upload/$1 [C]
RewriteRule ^([^.]*)\.domain\.example/upload/(.*)$ /upload/$1/$2 [L]

Allerdings wird daraus dann sowas erzeugt:

/upload/vhost/vhost/vhost/vhost/vhost/vhost/vhost/vhost/vhost/vbilder/11.jpg/11.jpg/11.jpg/vbilder/11.jpg/11.jpg/11.jpg/vhost/vbilder/11.jpg/11.jpg/11.jpg/vbilder/11.jpg/11.jpg/11.jpg/vhost/vhost/vbilder/11.jpg/11.jpg/11.jpg/vbilder/11.jpg/11.jpg/11.jpg/vhost/vbilder/11.jpg/11.jpg/
...

Wo ist mein Denkfehler? Bzw. wie kann ich sicherstellen, dass die
RewriteRule nur einmal angewendet wird?

Gustaf Mossakowski

unread,
Dec 13, 2011, 6:42:09 AM12/13/11
to
Stefan Dreyer schrieb:

> Ich möchte gerne folgende URLs umschreiben:
>
> http://vhost.domain.example/upload/image/11.jpg
> in
> http://vhost.domain.example/upload/vhost/image/11.jpg
>
> Wobei vhost ein Wildcard ist, dass heißt eine beliebige Subdomain sein kann.
> Das habe ich mal probiert:
>
> RewriteCond %{HTTP_HOST} ^[a-z0-9\-]+\.domain\.example$
> RewriteRule upload/(.*) %{HTTP_HOST}/upload/$1 [C]
> RewriteRule ^([^.]*)\.domain\.example/upload/(.*)$ /upload/$1/$2 [L]
> [...]
> Wo ist mein Denkfehler? Bzw. wie kann ich sicherstellen, dass die
> RewriteRule nur einmal angewendet wird?

Schreib die RewriteRule in die httpd.conf, dann sollte sie eigentlich
nur einmal angewendet werden. Wenn Du eine .htaccess-Datei benutzt, muß
der Apache immer wieder von vorne anfangen, wenn er eine URL aufgelöst
hat, findet dann die .htaccess und versucht sie, erneut aufzulösen.

Einfacher ist sicher, die Verzeichnisse unterschiedlich zu benennen.
Also in diesem Fall das interne Verzeichnis, so wie es ist,
beispielsweise upload_ zu nennen. Dann gibt es die Probleme nicht.

Viele Grüße
Gustaf

Stefan Dreyer

unread,
Dec 13, 2011, 10:10:56 AM12/13/11
to
Am 13.12.2011 12:42, schrieb Gustaf Mossakowski:
> Stefan Dreyer schrieb:
>
>> Ich möchte gerne folgende URLs umschreiben:
>>
>> http://vhost.domain.example/upload/image/11.jpg
>> in
>> http://vhost.domain.example/upload/vhost/image/11.jpg
>>
>> Wobei vhost ein Wildcard ist, dass heißt eine beliebige Subdomain sein kann.
>> Das habe ich mal probiert:
>>
>> RewriteCond %{HTTP_HOST} ^[a-z0-9\-]+\.domain\.example$
>> RewriteRule upload/(.*) %{HTTP_HOST}/upload/$1 [C]
>> RewriteRule ^([^.]*)\.domain\.example/upload/(.*)$ /upload/$1/$2 [L]
>> [...]
>> Wo ist mein Denkfehler? Bzw. wie kann ich sicherstellen, dass die
>> RewriteRule nur einmal angewendet wird?
>
> Schreib die RewriteRule in die httpd.conf, dann sollte sie eigentlich
> nur einmal angewendet werden. Wenn Du eine .htaccess-Datei benutzt, muß
> der Apache immer wieder von vorne anfangen, wenn er eine URL aufgelöst
> hat, findet dann die .htaccess und versucht sie, erneut aufzulösen.

Das wusste ich noch nicht. Gibt es dazu irgendwo genauere Informationen?

> Einfacher ist sicher, die Verzeichnisse unterschiedlich zu benennen.
> Also in diesem Fall das interne Verzeichnis, so wie es ist,
> beispielsweise upload_ zu nennen. Dann gibt es die Probleme nicht.

Das habe ich zwischenzeitlich auch so gemacht, bzw. habe ich, damit ich
in der Applikation nichts ändern muss einfach das zweite Verzeichnis als
symbolischen Link gelegt. Im Übrigen habe ich auch entdeckt, dass man
sich (zumindest ab apache 2.2) die 2. Zeile sparen kann und folgendes
schreiben:

RewriteCond %{HTTP_HOST} ^([a-z0-9\-]+)\.domain\.example$
RewriteRule ^upload/(.*)$ /dateien/%1/$1 [L]


Gustaf Mossakowski

unread,
Dec 13, 2011, 12:56:01 PM12/13/11
to
Stefan Dreyer schrieb:

> Am 13.12.2011 12:42, schrieb Gustaf Mossakowski:
>> Schreib die RewriteRule in die httpd.conf, dann sollte sie
>> eigentlich nur einmal angewendet werden. Wenn Du eine
>> .htaccess-Datei benutzt, muß der Apache immer wieder von vorne
>> anfangen, wenn er eine URL aufgelöst hat, findet dann die .htaccess
>> und versucht sie, erneut aufzulösen.
>
> Das wusste ich noch nicht. Gibt es dazu irgendwo genauere Informationen?

Ja, im Handbuch.

| When you manipulate a URL/filename in per-directory context
| mod_rewrite first rewrites the filename back to its corresponding URL
| (which is usually impossible, but see the RewriteBase directive below
| for the trick to achieve this) and then initiates a new internal
| sub-request with the new URL. This restarts processing of the API
| phases.
<http://httpd.apache.org/docs/2.0/rewrite/rewrite_tech.html>

> Im Übrigen habe ich auch entdeckt, dass man
> sich (zumindest ab apache 2.2) die 2. Zeile sparen kann und folgendes
> schreiben:
>
> RewriteCond %{HTTP_HOST} ^([a-z0-9\-]+)\.domain\.example$
> RewriteRule ^upload/(.*)$ /dateien/%1/$1 [L]

Sollte auch in 1.3 gehen:

| RewriteCond backreferences: These are backreferences of the form
|
| %N
|
| (1 <= N <= 9) which provide access to the grouped parts (parentheses!)
| of the pattern from the last matched RewriteCond directive in the
| current bunch of conditions.
<http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteCond>

Viele Grüße, Gustaf
0 new messages