2009-08-14 20 views
5

Próbuję zaimplementować przełączanie języków w pliku .htaccess, a jedyne, co pozostało, to obsłużyć klientów, którzy nie obsługują plików cookie. Aby to zrobić, muszę ustawić prefer-language, gdy użytkownik kliknie łącze z parametrem language.Jak używać SetEnv z parametrem adresu 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 

Problem dotyczy ostatniej linii - wartość jest zawsze pusta. Działa, jeśli ją zakodowuję, ale nie, jeśli spróbuję odnieść się do zmiennej. Czy istnieje jakaś specjalna składnia odnosząca się do zmiennych środowiskowych w tym kontekście, czy jest jakiś inny sposób ustawienia prefer-language?

Edytuj: Przekazano do Apache users list.

Odpowiedz

7

Można ustawić zmienne środowiskowe również za pomocą mod_rewrite. Właściwie już to zrobiłeś (zobacz env/E flag).


nie mogę przetestować go z mod_negotiation siebie, ale następujące powinny działać i ustawić 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 

Ale byłoby znacznie łatwiejsze, jeśli umieścić identyfikator języka na ścieżce URL jak /en/…:

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

ja nie wiem, czy potrzebny jest dodatkowy drugi SetEnvIf zmienna /.

+0

Próbowałem go, i to nie działa (przynajmniej z tego): RewriteRule^(. *) $ 1? [cookie = język:% 1: .example.com: 7200: /, env = prefer-language:% 1, redirect = permanent] Czy coś nie rozumiem? – l0b0

+0

Nie można ustawić zmiennej środowiskowej i wykonać przekierowania w tym samym czasie. Więc raczej musisz przetestować ciasteczko: 'RewriteCond% {HTTP_COOKIE} (?:^| [, \]) Language = (en | fr | no) RewriteRule^- [E = prefer-language:% 1]' – Gumbo

+0

I "Nie jestem pewien, w jaki sposób odbywa się interakcja z klientem, ale następujące czynności nie działają, gdy pliki cookie są wyłączone na kliencie, co staram się naprawić: RewriteEngine On RewriteBase/ RewriteCond% {QUERY_STRING} (?:^| &) language = (en | fr | no) RewriteRule^(. *) $ 1? [cookie = język:% 1: .example.com: 7200: /, przekierowanie = stały] RewriteCond% {HTTP_COOKIE} (?:^| [, \]) language = (. *) RewriteRule^- [E = prefer-language:% 1] – l0b0

1

Wygląda na to, że nie ma obsługi zmiennych w SetEnv, ale tutaj jest działająca konfiguracja, jeśli ktoś inny próbuje zrobić to samo. Jest to prostsze rodzaj wyboru języka, gdyż po prostu kopiuje parametru z odsyłający do aktualnej zawartości language jeśli nie zmieniło:

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> 
Powiązane problemy