2009-08-14 51 views
5

Tôi đang cố triển khai chuyển đổi ngôn ngữ bằng .htaccess và điều duy nhất còn lại là xử lý các ứng dụng không hỗ trợ cookie. Để làm điều đó, tôi phải đặt prefer-language khi người dùng nhấp vào liên kết có thông số language.Cách sử dụng SetEnv với thông số 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 

Sự cố với dòng cuối cùng - Giá trị luôn được đặt thành trống. Nó hoạt động nếu tôi hardcode nó, nhưng không phải nếu tôi cố gắng tham khảo một biến. Có một số cú pháp đặc biệt để chỉ các biến môi trường trong ngữ cảnh này hay không, hoặc có cách nào khác để đặt prefer-language không?

Chỉnh sửa: Cross-posted to Apache users list.

Trả lời

7

Bạn cũng có thể đặt biến môi trường với mod_rewrite. Trên thực tế, bạn đã làm điều đó (xem env/E flag).


tôi không thể thử nghiệm nó với mod_negotiation bản thân mình, nhưng sau nên làm việc và thiết lập 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 

Nhưng nó sẽ được dễ dàng hơn nếu bạn đặt nhận dạng ngôn ngữ vào đường dẫn URL như /en/…:

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

tôi không biết nếu bạn cần thêm thứ hai biến/SetEnvIf.

+0

Tôi đã thử và không hoạt động (ít nhất với điều này): RewriteRule^(. *) $ 1 đô la? [cookie = language:% 1: .example.com: 7200: /, env = ngôn ngữ ưa thích:% 1, chuyển hướng = vĩnh viễn] Tôi có hiểu nhầm điều gì đó không? – l0b0

+0

Bạn không thể đặt biến môi trường và thực hiện chuyển hướng cùng một lúc. Vì vậy, bạn cần phải kiểm tra cookie: 'RewriteCond% {HTTP_COOKIE} (?:^| [, \]) Language = (vi | fr | không) RewriteRule^- [E = ngôn ngữ ưa thích:% 1]' – Gumbo

+0

I 'không chắc chắn cách tương tác với khách hàng được thực hiện, nhưng những điều sau không hoạt động khi cookie bị vô hiệu hóa trên máy khách, đó là những gì tôi đang cố sửa: RewriteEngine On RewriteBase/ RewriteCond% {QUERY_STRING} (?:^| &) language = (vi | fr | no) RewriteRule^(. *) $ 1 đô la? [cookie = language:% 1: .example.com: 7200: /, redirect = permanent] RewriteCond% {HTTP_COOKIE} (?:^| [, \]) language = (. *) RewriteRule^- [E = thích-ngôn ngữ:% 1] – l0b0

1

Có vẻ như không có hỗ trợ cho các biến trong SetEnv, nhưng đây là cấu hình hoạt động nếu ai đó đang cố gắng thực hiện tương tự. Đây là loại lựa chọn ngôn ngữ đơn giản hơn vì nó chỉ sao chép thông số language từ tham chiếu đến URL hiện tại nếu nó không thay đổi:

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> 
Các vấn đề liên quan