2014-07-14 61 views
0

我爲我的multil找到了以下.htaccess文件。項目。 但是有一些問題我無法解決。使用htaccess和多語言網站的重寫規則

目標是重寫URL,例如來自:

/en/prod/index.php 

/prod/index.php?lang=en 

這必須爲每個文件夾,而不是隻爲督促。 有時鏈接在?之後已經有一些變量,所以重寫規則應該檢測到這個?並將其更改爲&。 使用我的代碼,我可以用&代替?,但是如果沒有?存在,這也適用!

二(和主要)問題: 如果文件存在(在我前面的例子)/prod/index.php然後在瀏覽器應該顯示此頁,但如果文件不存在,所有的請求應該被重定向到index.php

隨着我的代碼請求是總是重定向,因爲該文件不對應的鏈接,所以條件不匹配。

謝謝你的幫助!

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -l 
RewriteCond %{QUERY_STRING} ^(\??)(.*)$ [NC] 
RewriteCond %{REQUEST_URI} ^/(it|en)/(.*)$ [NC] 

#is it possible here to have %3 instead of rewriting (it|en)? Does not work... 
RewriteRule ^(it|en)/(.*)$ /%3/$2?lang=%3&%2 [NC,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteRule ^.*$ index.php [NC,L] 

回答

1

嘗試:

RewriteEngine On 

RewriteCond %{REQUEST_URI} ^/(it|en)/(.*)$ 
RewriteCond %{DOCUMENT_ROOT}/%2 -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/%2 -d 
RewriteRule ^(it|en)/(.*)$ /$2?lang=$1 [L,QSA] 

RewriteCond %{REQUEST_URI} ^/(it|en)/(.*)$ 
RewriteCond %{DOCUMENT_ROOT}/%2 !-f 
RewriteCond %{DOCUMENT_ROOT}/%2 !-d 
RewriteRule ^(it|en)/(.*)$ /index.php?lang=$1 [L,QSA] 
+0

謝謝!你能否在'%{DOCUMENT_ROOT}'之後更好地向我解釋'%2'? 「RewriteRule」的第一部分不能包含像'%1'或'$ 1'這樣的變量以避免重複'(it | en)'? – Perocat

+0

@Perocat試圖確定'%{REQUEST_URI}'行中的匹配組「(。*)」是否存在。 –

+0

謝謝!因此它檢查是否存在'DOCUMENT_ROOT/files/file.php'成爲'DOCUMENT_ROOT/files/file.php'(其中'$ 2'是從'(。*)中取得的'files/file.php') '在第一個RewriteCond中的'/(it | en)/'之後)? – Perocat

1

您可以使用這些通用的規則:

RewriteEngine On 

RewriteCond %{DOCUMENT_ROOT}/$2 -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/$2 -d 
RewriteRule ^([a-z]{2})/(.+)$ /$2?lang=$1 [L,QSA] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule . index.php [L] 
+0

謝謝!在lang = $ 1之後應該添加的文件之後的變量是什麼? – Perocat

+0

這將通過使用'QSA'標誌照顧。這將使URI像這樣''/prod/index.php?lang=fr&foo=bar&id=123' – anubhava

+0

當語言不存在時原來的'?'會自動被'&'替換? – Perocat