2010-09-07 60 views
2

我有這樣的.htaccess規則:重寫路徑段任意數量的查詢參數

RewriteRule viewshoplatest/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/$ /viewshoplatest.php?$1=$2&$3=$4&$5=$6&$7=$8&$9=$10&$11=$12&$13=$14&$15=$16 

應該映射這樣的URL:

http://www.veepiz.com/viewshoplatest/start/10/end/10/filter/0/ownerid/0/sortby/date/sortdir/DESC/cat/0/scat/0/ 

這樣:

http://www.veepiz.com/viewshoplatest.php?start=0&end=10&filter=0&ownerid=0&sortby=date&sortdir=DESC&cat=0&scat=0 

當我點擊鏈接並打印$_GET變量我得到這個:

Array ([start] => 10 [end] => 10 [filter] => 0 [ownerid] => 0 [sortby] => start0 [start1] => start2 [start3] => start4 [start5] => start6) 

任何想法爲什麼它表現不好?


好吧,我已經通過重寫規則固定這

RewriteRule viewshoplatest/start/(.*)/end/(.*)/filter/(.*)/ownerid/(.*)/sortby/(.*)/sortdir/(.*)/cat/(.*)/scat/(.*)/$ /viewshoplatest.php?start=$1&end=$2&filter=$3&ownerid=$4&sortby=$5&sortdir=$6&cat=$7&scat=$8 
+0

看來,我喜歡當它達到超過$ 9中調用$ 1 $ 10以上上述 – 2010-09-07 05:07:14

回答

5

首先:如果您可以更具體一些,則不應使用.*,例如[^/]+。因爲多個.*會導致巨大的回溯。所以:

RewriteRule ^viewshoplatest/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ /viewshoplatest.php?$1=$2&$3=$4&$5=$6&$7=$8&$9=$10&$11=$12&$13=$14&$15=$16 

可以使用了像RegexBuddy看到這些正則表達式是如何處理的差異。

但由於mod_rewrite的確實只允許引用第一九組(見Tim’s answer),你可以同時使用迭代的方法和過程中的一個參數:

RewriteRule ^viewshoplatest/([^/]+)/([^/]+)/([^/]+/[^/]+/.*)$ /viewshoplatest/$3?$1=$2 [QSA,N] 
RewriteRule ^viewshoplatest/([^/]+)/([^/]+)/([^/]*)/?$ /viewshoplatest.php?$1=$2&$3 [QSA,L] 

的第一條規則將處理一個參數對(參見N標誌),然後重新啓動重寫過程(除最後一對之外),然後重新啓動重寫過程(請參閱N標誌)。第二條規則將重寫最後一個參數對(或名稱)並結束迭代。

但因爲使用ñ標誌可能是危險的,因爲它可能導致無限遞歸,你也可以使用PHP來解析請求的路徑:

$_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); 
$segments = implode('/', trim($_SERVER['REQUEST_URI_PATH'], '/')); 
array_shift($segments); // remove path prefix "/viewshoplatest" 
for ($i=0, $n=count($segments); $i<$n;) { 
    $_GET[rawurldecode($segments[$i++])] = ($i < $n) ? rawurldecode($segments[$i++]) : null; 
} 

現在你只需要這條規則傳遞通過要求:

RewriteRule ^viewshoplatest(/|$) /viewshoplatest.php [L] 
+0

小幅調整:'爆炸()''的REQUEST_URI_PATH',不'破滅()'。 :) – cautionbug 2013-10-22 16:16:55

3

只是爲了你發現什麼了擴展,只能定義九組用作反向引用,這就是爲什麼它通常是一個更好的想法是重寫一個腳本sans-query字符串,並在腳本需要解析出大量數據的情況下檢查REQUEST_URI

the documentation

回到引用是 形式$ N的標識符(N = 0..9),這將是 取代第N 組匹配的模式的內容

$0是整個匹配模式,給你剩下的九個數字來處理。任何更高的數字都被視爲反向引用,後跟一些文字數字字符。