2013-05-03 100 views
0

我想建立一個網站,可以從地址欄被稱爲具有以下任何一個例子:的.htaccess和動態生成SEO友好的URL

domainname.com/en 
domainname.com/zh-cn/ 
domainname.com/fr/page1 
domainname.com/ru/dir1/page2 
domainname.com/jp/dir1/page2/ 
domainname.com/es-mx/dir1/dir2/page3.html 

這些頁面請求需要打我的。 htaccess的模板並最終轉換成這個PHP電話:

/index.php?lng=???&tpl=??? 

我一直在努力使的RewriteCond重寫規則和代碼,將安全處理我想參加,但全部落敗的URL的動態性質。我已經讀了近50個不同的網站,並且已經研究了近一週的時間,但我不知道我在做什麼。我甚至不知道我是否應該使用RewriteCond。這是我在做一個重寫規則我最後一次嘗試:

RewriteRule ^(([a-z]{2})(-[a-z]{2})?)([a-z0-9-\./]*) /index.php?lng=$1&tpl=$4 [QSA,L,NC] 

感謝您的幫助,

文斯

+0

僅供參考:當我在http://htaccess.madewithlove.be/上測試這個事情沒有問題,但後來我在自己的服務器上測試,我總是收到'500內部服務器錯誤'。除非我將我的.htaccess從服務器上刪除,否則我的域名甚至不會提供其他參數。 – Vince 2013-05-03 18:11:44

+0

我在我的htaccess中添加了一個循環限制器,它似乎解決了我的問題,但我仍然不明白什麼是循環。 RewriteCond%{ENV:REDIRECT_STATUS} 200 RewriteRule。* - [L] – Vince 2013-05-03 19:29:50

回答

1

是什麼造成你的循環,你的正則表達式模式匹配/index.php。爲什麼?讓我們一起來看看:

首先,前綴被剝離,因爲這是在一個htaccess文件規則,所以第一個改寫後的URI是:index.php(查詢字符串分開)

您正則表達式的開頭: ^(([a-z]{2})(-[a-z]{2})?),匹配in在URI中

您的正則表達式的下一位:([a-z0-9-\./]*)匹配dex.php。因此,規則匹配並再次應用,並且將繼續應用,直到達到內部遞歸限制。

你的URL結構:

domainname.com/en 
domainname.com/zh-cn/ 
domainname.com/fr/page1 
domainname.com/ru/dir1/page2 
domainname.com/jp/dir1/page2/ 
domainname.com/es-mx/dir1/dir2/page3.html 

要麼有國家代碼或什麼都沒有經過/,所以你需要考慮的是:

# here -------------------v 
^(([a-z]{2})(-[a-z]{2})?)(/([a-z0-9-\./]*))?$ 
#  and an ending match here ------------^ 

你不應該需要改變其他:

RewriteRule ^(([a-z]{2})(-[a-z]{2})?)(/([a-z0-9-\./]*))?$ /index.php?lng=$1&tpl=$4 [QSA,L,NC] 
+0

Jon ty,你救了我的理智。從這裏的其他一切歸結爲簡單的PHP字符串解析,我沒有任何問題。 – Vince 2013-05-03 20:05:03