2014-01-12 93 views
0

我正在嘗試創建簡單的重寫引擎,以使我的url更美麗。目前我使用此:重寫引擎爲php應用程序

RewriteEngine on 
    RewriteRule ^([a-zA-Z0-9_]*)/?([a-zA-Z0-9_]*)?/?([a-zA-Z0-9\-_/]*)?/?$ index.php?controller=$1&action=$2&id=$3 [NC,L] 

所以,當我進入這個網址:

www.domain.com/fooo/bar/foobar 

我會從PHP格特:

Array 
    (
     [controller] => fooo 
     [action] => bar 
     [id] => foobar 
    ) 

我要更新這個重寫規則,所以當網域的部分url以2-3chars開頭後,它會創建不同的數組,如下所示:

from www.domain.com/eng/fooo/bar/foobar

Array 
(
    [lang] => eng 
    [controller] => fooo 
    [action] => bar 
    [id] => foobar 
) 

我創造了新的規則:

RewriteEngine on 
    RewriteRule ^([a-z]{2,3})/?([a-zA-Z0-9_]*)?/?([a-zA-Z0-9_]*)?/?([a-zA-Z0-9\-_/]*)?/?$ index.php?lang=$1&controller=$2&action=$3&id=$4 [NC,L] 
    RewriteRule ^([a-zA-Z0-9_]*)/?([a-zA-Z0-9_]*)?/?([a-zA-Z0-9\-_/]*)?/?$ index.php?controller=$1&action=$2&id=$3 [NC,L] 

但是當我進入www.mydomain.com/english/foo/bar/foobar

它給了我:

Array 
    (
     [lang] => eng 
     [controller] => lish 
     [action] => foo 
     [id] => bar/foobar 
    ) 

,但我期待

Array 
    (
     [controller] => english 
     [action] => foo 
     [id] => bar/foobar 
    ) 

因爲單詞「english」長於3chars。

有人可以幫我解決這個問題嗎?謝謝!

回答

3

新規則有一個可選//?),所以會很樂意配合一些東西,有三個字母 - ([a-z]{2,3}) - 直接跟着一些字母 - ([a-zA-Z0-9_]*)

事實上,你有? S和*遍佈在這些規則的地方,當據我可以看到你想要檢查的事情那裏,不只是他們可能

嘗試取出? S,並切換到+(1或多個),而不是*(0或更多):

RewriteEngine on 
RewriteRule ^([a-z]{2,3})/([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9\-_/]+)/$ index.php?lang=$1&controller=$2&action=$3&id=$4 [NC,L] 
RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9\-_/]+)/$ index.php?controller=$1&action=$2&id=$3 [NC,L] 

如果要匹配,其中只有某些部分的存在的模式(例如包含2個部分的URL,而不是3或4),然後爲這些添加單獨的規則。

(順便說一句,形式([some-range]*)?是多餘的,無論如何,爲*表示「0以上的範圍內」,並且?意思是「一前述基團的0或1個實例」 - 讓你有「0或1一組0個或更多的實例「。)

+0

感謝您給我的想法,工作的解決方案只需要刪除第一個問號。順便說一句。控制器,動作和ID不需要設置。如果它們沒有設置,index.php中的Loader類將使用默認信息(控制器的主目錄,操作的索引)填充它們。但是,謝謝! :) –

+1

@ M.Svrcek正如我所說,我認爲最好用單獨和兩部分URL的單獨顯式規則來處理它。在像這樣的正則表達式中有大量的可選位只會導致你在稍後出現更奇怪的邊緣情況,並且使規則的處理效率降低。 – IMSoP

+0

感謝您的建議,我會嘗試重拍他們:) –

1

您也可以使用非捕獲組上你的第一個{2,3}塊這樣的,以確保它的{2,3}要求跟一個斜線相匹配..

(?:([a-z]{2,3})/)?([a-zA-Z0-9_]*)?/?([a-zA-Z0-9_]*)?/?([a-zA-Z0-9\-_/]*)?/? 

第1組始終包含您的兩/三字符匹配或爲空

+0

我不想明確地添加語言,在我上面的代碼中的問題是當我使用控制器例如「產品」的規則將被翻譯像lang = pro&controller = duct ... –

+0

謝謝,爲了試圖幫助我,解決方案是刪除語言組後的第一個問號:)還是謝謝,男人! –

相關問題