2009-08-14 6 views
5

Ich versuche, Sprachumschaltung in. Htaccess zu implementieren, und das einzige, was jetzt noch ist, ist die Behandlung von Clients, die keine Cookies unterstützen. Um dies zu tun, muss ich prefer-language setzen, wenn der Benutzer auf einen Link mit einem language Parameter klickt.Wie verwende ich SetEnv mit einem URL-Parameter

RewriteEngine On 
RewriteBase/
RewriteCond %{QUERY_STRING} (?:^|&)language=(en|fr|no) 
RewriteRule ^(.*)$ $1? [cookie=language:%1:.example.com,env=language:%1,R] 

SetEnv prefer-language $language 

Das Problem ist mit der letzten Zeile - Der Wert wird immer auf leer gesetzt. Es funktioniert, wenn ich es fest codiere, aber nicht, wenn ich versuche, auf eine Variable zu verweisen. Gibt es eine spezielle Syntax, um in diesem Kontext auf Umgebungsvariablen zu verweisen, oder gibt es eine andere Möglichkeit, prefer-language zu setzen?

Bearbeiten: Cross-Posted zu Apache users list.

Antwort

7

Sie können Umgebungsvariablen auch mit mod_rewrite festlegen. Eigentlich hast du das schon gemacht (siehe env/E flag).


ich es nicht mit mod_negotiation selbst testen können, aber die folgenden sollte die prefer-language arbeiten und setzen:

RewriteCond %{QUERY_STRING} ^((?:[^&]&)*)language=(en|fr|no)&?([^&].*)?$ 
RewriteRule^%{REQUEST_URI}?%1%3 [L,CO=language:%2,R] 
RewriteCond %{HTTP_COOKIE} (^|[,\s])language=([^\s,;]+) 
RewriteRule^- [L,E=prefer-language:%2] 
SetEnvIf REDIRECT_prefer-language (.+) prefer-language=$1 

Aber es wäre viel einfacher, wenn Sie die Sprachkennung in die URL-Pfad setzen wie /en/…:

SetEnvIf Request_URI ^/(en|fr|no)/ prefer-language=$1 
SetEnvIf REDIRECT_prefer-language (.+) prefer-language=$1 

ich weiß nicht, ob Sie die zusätzlichen/Sekunde SetEnvIf Variable benötigen.

+0

ich es ausprobiert habe, und es funktioniert nicht (zumindest mit diesem): RewriteRule^(. *) $ $ 1? [cookie = Sprache:% 1: .example.com: 7200: /, env = prefer-Sprache:% 1, redirect = permanent] Missverständnis ich etwas? – l0b0

+0

Sie können keine Umgebungsvariable festlegen und gleichzeitig eine Umleitung ausführen. Sie müssen also eher den Cookie testen: 'RewriteCond% {HTTP_COOKIE} (?:^| [, \]) Language = (en | fr | no) RewriteRule^- [E = prefer-language:% 1]' – Gumbo

+0

I bin nicht sicher, wie die Interaktion mit dem Client gemacht wird, aber das Folgende funktioniert nicht, wenn Cookies auf dem Client deaktiviert sind, was ich zu beheben versuche: RewriteEngine On RewriteBase/ RewriteCond% {QUERY_STRING} (?:^| &) language = (en | fr | no) RewriteRule^(. *) $ $ 1? [cookie = Sprache:% 1: .example.com: 7200: /, redirect = permanent] RewriteCond% {HTTP_COOKIE} (?:^| [, \]) Sprache = (. *) RewriteRule^- [E = prefer-language:% 1] – l0b0

1

Sieht so aus, als ob es keine Unterstützung für Variablen in SetEnv gibt, aber hier ist eine funktionierende Konfiguration, wenn jemand anderes versucht, das Gleiche zu tun. Es ist eine einfachere Art von Sprache Auswahl, da es nur Kopien der language Parameter aus der Referer auf die aktuelle URL, wenn es sich nicht geändert:

RewriteEngine On 
RewriteBase/

# Keep the language parameter if specified in the last URL 
RewriteCond %{HTTP_REFERER} ^(?:.*[&?])?language=(en|fr|no).*$ 
RewriteCond %{QUERY_STRING} !^(?:.*&)?language=(en|fr|no).*$ 
RewriteRule ^(.*)$ $1?language=%1 [redirect=permanent] 

# Set the language from the URL parameter 
RewriteCond %{QUERY_STRING} ^(?:.*&)?language=(en|fr|no).*$ 
RewriteRule^- [env=prefer-language:%1] 

# Cache only when the language parameter is set 
<IfDefine !prefer-language> 
    Header set Vary * 
</IfDefine>