2009-08-14 77 views
5

我試圖在.htaccess中實現語言切換,現在唯一剩下的就是處理不支持cookie的客戶端。要做到這一點,當用戶點擊帶有language參數的鏈接時,我必須設置prefer-language如何通過URL參數使用SetEnv

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 

問題是與最後一行 - 該值始終設置爲空。它工作,如果我硬編碼,但不是如果我嘗試引用一個變量。在這種情況下是否有一些特殊的語法來引用環境變量,或者有其他方法可以設置prefer-language

編輯:跨貼到Apache users list

回答

7

您也可以使用mod_rewrite設置環境變量。其實,你已經這麼做了(見env/E flag)。


我不能mod_negotiation模塊測試它自己,但以下應該工作,並設置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 

但是,如果你把語言識別爲URL路徑會容易得多像/en/…

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

如果你需要額外的/第二SetEnvIf可變我不知道。

+0

我試了一下,這是行不通的(至少在這):RewriteRule ^(。*)$ $ 1? [cookie = language:%1:.example.com:7200:/,env = prefer-language:%1,redirect = permanent]我誤解了什麼嗎? – l0b0 2009-08-14 22:08:40

+0

您不能設置環境變量並同時執行重定向。所以你需要測試cookie:'RewriteCond%{HTTP_COOKIE}(?:^ | [,\])language =(en | fr | no)RewriteRule^- [E = prefer-language:%1]' – Gumbo 2009-08-14 22:54:14

+0

I不知道如何與客戶端進行交互,但在客戶端禁用cookie時,以下情況不起作用,這正是我想要解決的問題: RewriteEngine在 RewriteBase/ RewriteCond%{QUERY_STRING} (?:^ |&)language =(en | fr | no) RewriteRule ^(。*)$ $ 1? [cookie = language:%1:.example.com:7200:/,redirect = permanent] RewriteRule^- [E = prefer-language:%1] – l0b0 2009-08-15 09:11:51

1

看起來像是不支持SetEnv中的變量,但如果其他人試圖執行相同的操作,這裏有一個工作配置。這是一個簡單的一種語言選擇,因爲它只是複製從引薦到當前URL的language參數,如果它沒有改變:

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>