Apache/mod_rewrite, Environment Variable in RewriteRule

Apache, Lighttpd, nginx, Cherokee
marvet
Posts: 36
Joined: 2006-07-11 10:44

Apache/mod_rewrite, Environment Variable in RewriteRule

Post by marvet » 2008-01-25 20:33

Hallo zusammen,

gleich zum Problem. In einem VirtualHost setze ich mittels SetEnvIf eine zusätzliche Environment Variable. Diese nutze ich später in RewriteRules via mod_rewrite.

Code: Select all

Beispiel 1)
SetEnvIf Host ^de. PORTAL_LANG=de
SetEnvIf Host ^en. PORTAL_LANG=en
RewriteEngine On
RewriteRule ^/(.*)$ /portal/%{ENV:PORTAL_LANG}/$1 [QSA,L]

Beispiel 2)
SetEnv PORTAL_LANG de
RewriteEngine On
RewriteRule ^/(.*)$ /portal/%{ENV:PORTAL_LANG}/$1 [QSA,L]


Das oben genannte Beispiel (1) funktioniert einwandfrei. Setze die Environment Variable allerdings nicht via SetEnvIf, sondern via SetEnv direkt wie in Beispiel (2), funktioniert es nicht mehr. Die Environment Variable ist mod_rewrite dann anscheinend unbekannt. Das Ergebnis ist ein Error 404. Ein Eintrag im Error Log lautet dann "[error] [client xxx.xxx.xxx.xxx] File does not exist: /home/www/example/portal". Der eigentlich zu suchenende Pfad wird also entgegen normalen Fehlermeldungen dieser Art nicht vollständig angezeigt.

Hat jemand hierzu eine Idee? Vorab vielen Dank für Eure Hinweise!

Beste Grüße,
Markus

dotme
Posts: 150
Joined: 2004-12-15 16:48

Re: Apache/mod_rewrite, Environment Variable in RewriteRule

Post by dotme » 2008-01-26 00:33

mod_setenvif scheint eine sehr hohe Priorität zu haben, da es bereits in einer der frühesten Phasen eingreift (Post-Read Request) wie man gut in der Ausgabe von mod_info sehen (server-info) kann. Das liegt vermutlich daran, daß mod_setenvif die Authorisierung und bestimmte HTTP-Features beeinflussen kann :?:. Ich denke Du kanst in Deinem ersten Beispiel aber eh ganz auf mod_setenvif verzichten und den Host-Header in einer RewriteCond mitprüfen.

mod_env mit seinem "SetEnv" ist dann wohl eher nur zum Aufbau einer CGI-Umgebung gedacht.

djcrackman
Posts: 207
Joined: 2005-06-02 11:58

Re: Apache/mod_rewrite, Environment Variable in RewriteRule

Post by djcrackman » 2008-01-27 11:10

SetEnv directive
Syntax: SetEnv env-variable value
Context: server config, virtual host, directory, .htaccess
Override: FileInfo
Status: Base
Module: mod_env
Compatibility: SetEnv is only available in Apache 1.1 and later. Directory and .htaccess context is available in Apache 1.3.7 and later.

Sets an environment variable, which is then passed on to CGI scripts and SSI pages. Example:

SetEnv SPECIAL_PATH /foo/bin


SetEnv vs SetEnvIf

Liest man so die Doku, dann gibt scheinbar SetEnv die Variablen nur an Executor weiter (Perl via CGI, etc).