2013-04-08 42 views
0

我試圖編寫一個多語言網站的規則。例如,www.hostname.com/fr & www.hostname.com/de都可以,但嘗試使用其他語言標記應重定向到www.hostname.com/en。 www.hostname.com/it重定向到www.hostname.com/en,www.hostname.com/es重定向到www.hostname.com/en等...在htaccess工作中不能做出負面的條件

我成功地制定了一些規則「積極」的方式,但每次我加一個!創造一個負面的規則,它不起作用。

例如:

RewriteCond %{HTTP_HOST} ^www.hostname.com$ 
RewriteCond %{REQUEST_URI} ^/?([a-z]{2})/?$ 
RewriteCond %{REQUEST_URI} ^/?(fr|de)/?$ 
RewriteRule (.*) http://www.hostname.com/en [L,R=301] 

此代碼重定向一切hostname.com/en。我希望只有標籤不同於fr et de重定向到en。所以我試過了:

RewriteCond %{HTTP_HOST} ^www.hostname.com$ 
RewriteCond %{REQUEST_URI} ^/?([a-z]{2})/?$ 
RewriteCond %{REQUEST_URI} !^/?(fr|de)/?$ 
RewriteRule (.*) http://www.hostname.com/en [L,R=301] 

剛剛加了個!但它不起作用,URL永遠不會重定向。我可能在編寫規則時遺漏了一些東西......

+1

當我在http://htaccess.madewithlove.be進行測試時,您的否定規則完全按預期工作。但是,你將在'en'上有一個重寫循環。你可能需要用'^ /!?(FR | DE | EN)?/ $'此外,REQUEST_URI應該總是用'/'所以''使它可選的是沒有必要的開始。 – 2013-04-08 16:16:34

+0

我同意Michael Berkowski。您正在遭受無限循環,因爲/ en路徑正被重定向到自身。 mod_rewrite中的'L'標誌並不像很多人想象的那樣。即使是重寫URL要經過從頂部的httpd.conf或的.htaccess的指令,以及'L'標誌不阻止這種情況發生。 – Bobulous 2013-04-08 18:48:59

回答

1

你可以將它分成兩個規則。第一條規則處理fr,deen。它不會重寫任何內容,並將請求不變地傳遞給Apache。如果不匹配,第二個規則處理一切

RewriteCond %{REQUEST_URI} ^/(?:fr|de|en) 
RewriteRule^- [L] 

RewriteRule ^[a-z]{2}/(.*)$ /en/$1 [R,L] 

決不會啓用301測試,詳見這個答案Tips for debugging .htaccess rewrite rules

+0

謝謝你的幫助! – Neow 2013-04-09 11:28:36