2009-08-14 9 views
5

J'essaie d'implémenter le changement de langue dans .htaccess, et il ne me reste plus qu'à gérer les clients qui ne supportent pas les cookies. Pour ce faire, je dois définir prefer-language lorsque l'utilisateur clique sur un lien avec un paramètre language.Comment utiliser SetEnv avec un paramètre d'URL

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 

Le problème est avec la dernière ligne - La valeur est toujours définie sur vide. Cela fonctionne si je le code en dur, mais pas si j'essaie de me référer à une variable. Existe-t-il une syntaxe spéciale pour faire référence aux variables d'environnement dans ce contexte ou existe-t-il un autre moyen de définir prefer-language?

Édition: Publié au Apache users list.

Répondre

7

Vous pouvez également définir des variables d'environnement avec mod_rewrite. En fait, vous l'avez déjà fait (voir env/E flag).


Je ne peux pas le tester avec mod_negotiation moi-même, mais ce qui suit devrait fonctionner et régler le prefer-language:

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 

Mais il serait beaucoup plus facile si vous mettez l'identificateur de langue dans le chemin d'URL comme /en/…:

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

Je ne sais pas si vous avez besoin supplémentaire/seconde variable SetEnvIf.

+0

Je l'ai essayé, et ça ne fonctionne pas (au moins avec ce): RewriteRule^(. *) $ $ 1? [cookie = langue:% 1: .example.com: 7200: /, env = prefer-language:% 1, redirection = permanent] Suis-je en train de mal comprendre quelque chose? – l0b0

+0

Vous ne pouvez pas définir une variable d'environnement et effectuer une redirection en même temps. Vous avez donc besoin de tester le cookie: 'RewriteCond% {HTTP_COOKIE} (?:^| [, \]) Language = (fr | fr | no) RewriteRule^- [E = prefer-language:% 1]' – Gumbo

+0

I Je ne suis pas sûr comment l'interaction avec le client est faite, mais ce qui suit ne fonctionne pas lorsque les cookies sont désactivés sur le client, ce que j'essaie de résoudre: RewriteEngine sur RewriteBase/ RewriteCond% {QUERY_STRING} (?:^| &) language = (en | fr | no) RewriteRule^(. *) $ $ 1? [cookie = langue:% 1: .example.com: 7200: /, redirect = permanent] RewriteCond% {HTTP_COOKIE} (?:^| [, \]) language = (. *) RewriteRule^- [E = prefer-language:% 1] – l0b0

1

On dirait qu'il n'y a pas de support pour les variables dans SetEnv, mais voici une configuration de travail si quelqu'un d'autre essaie de faire la même chose. Il est une sorte plus simple de sélection de la langue, car elle se contente de recopier le paramètre language du referer à l'URL actuelle si elle n'a pas changé:

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>