2009-08-14 14 views
5

Estoy tratando de poner en práctica el cambio de idioma en el .htaccess, y lo único que queda ahora es manejar los clientes que no soportan las cookies. Para hacer eso, debo configurar prefer-language cuando el usuario hace clic en un enlace con un parámetro language.Cómo utilizar SetEnv con un parámetro de 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 

El problema es con la última línea - El valor siempre se establece en vacío. Funciona si lo codigo, pero no si trato de referirme a una variable. ¿Hay alguna sintaxis especial para referirse a variables de entorno en este contexto, o hay alguna otra forma de establecer prefer-language?

Editar: Cruz-publicado a Apache users list.

Respuesta

7

Puede establecer las variables de entorno con mod_rewrite también. En realidad, ya lo hizo (vea env/E flag).


no puedo probarlo con mod_negotiation mí mismo, pero el siguiente debería trabajar y establecer el 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 

pero sería mucho más fácil si se pone el identificador de idioma en la ruta URL como /en/…:

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

no sé si necesita la segunda variable de SetEnvIf/adicional.

+0

Lo he intentado y no funciona (al menos con esta): RewriteRule^(. *) $ $ 1? [cookie = language:% 1: .example.com: 7200: /, env = prefiera-language:% 1, redirect = permanent] ¿Estoy entendiendo mal algo? – l0b0

+0

No puede establecer una variable de entorno y hacer una redirección al mismo tiempo. Así que en lugar necesita probar la cookie: 'RewriteCond% {HTTP_COOKIE}: | idioma = (en | fr | no) RewriteRule^- [E = preferir-idioma:% 1] (^ [, \]?)' – Gumbo

+0

I No estoy seguro de cómo se realiza la interacción con el cliente, pero lo siguiente no funciona cuando las cookies están deshabilitadas en el cliente, que es lo que estoy tratando de corregir: RewriteEngine En RewriteBase/ RewriteCond% {QUERY_STRING} (?:^| &) language = (en | fr | no) RewriteRule^(. *) $ $ 1? [= Cookie de idioma:% 1: .example.com: 7200: /, = redirigir permanente] RewriteCond% {} HTTP_COOKIE (?:^| [, \]) (. *) Language = RewriteRule^- [E = prefer-language:% 1] – l0b0

1

Parece que no hay soporte para las variables en SetEnv, pero aquí es una configuración de trabajo si alguien está tratando de hacer lo mismo. Es un tipo más simple de selección de idioma, ya que sólo copia el parámetro language del árbitro a la URL actual si no ha cambiado:

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> 
Cuestiones relacionadas