2009-08-14 28 views
5

.htaccess'te dil geçişini uygulamaya çalışıyorum ve şimdi bıraktığım tek şey, çerezleri desteklemeyen istemcileri işlemektir. Bunu yapmak için, kullanıcı language parametresiyle bir bağlantıyı tıkladığında prefer-language ayarlamalıyım.SetEnv'yi bir URL parametresiyle birlikte kullanma

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 

Sorun, son satırda - Değer her zaman boş olarak ayarlanmıştır. Eğer kodu değiştirirsem çalışır, ama bir değişkene başvurmaya çalışırsam olmaz. Bu bağlamda ortam değişkenlerine başvurmak için özel bir sözdizimi var mı, yoksa prefer-language'u ayarlamanın başka bir yolu var mı?

Düzenleme: Apache users list için postalanan.

cevap

7

Ortam değişkenlerini mod_rewrite ile de ayarlayabilirsiniz. Aslında bunu zaten yaptınız (bkz. env/E flag).


Ben mod_negotiation ile kendim test edemez, ancak aşağıdaki çalışmak ve prefer-language belirlesin

:

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 

Ama URL yoluna dil tanımlayıcı koyarsanız çok daha kolay olurdu /en/… gibi: Başka/saniye SetEnvIf değişken gerekiyorsa bilmiyorum

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

.

+0

ve çalışmaz: Geçerli URL'ye referer dan sadece kopya language parametre beri değişti değilse, dil seçimi daha basit bir tür): RewriteRule^(. *) $ 1 $? [cookie = dil:% 1: .example.com: 7200: /, env = tercih dili:% 1, yönlendirme = kalıcı] Bir şeyi yanlış anlamış mıyım? – l0b0

+0

Bir ortam değişkeni ayarlayamaz ve aynı anda bir yönlendirme gerçekleştiremezsiniz. Bu yüzden cookie'yi test etmeniz gerekiyor: 'RewriteCond% {HTTP_COOKIE} (?:^| [, \]) Language = (en | fr | no) RewriteRule^- [E = tercih dili:% 1]' – Gumbo

+0

I İstemci ile etkileşimin nasıl yapıldığından emin değilim, ancak istemcide çerezler devre dışı bırakıldığında aşağıdakiler işe yaramaz, bu da düzeltmeye çalıştığım şeydir: RewriteEngine On RewriteBase/ RewriteCond% {QUERY_STRING} (?:^| &) language = (tr | no | no) RewriteRule^(. *) $ 1 $? [cookie = dil:% 1: .example.com: 7200: /, yönlendirme = kalıcı] RewriteCond% {HTTP_COOKIE} (?:^| [, \]) language = (. *) RewriteRule^- [E = tercih dili:% 1] – l0b0

1

SetEnv'de değişkenler için destek yok gibi görünüyor, ancak burada bir başkası aynı şeyi yapmaya çalışıyorsa çalışan bir yapılandırma var. en azından bu ile (Ben denedim

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> 
İlgili konular