2 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超4個(gè)贊
首先:.*
如果可以更具體,則不應(yīng)該使用,例如在這種情況下[^/]+
。因?yàn)槎鄠€(gè).*
會(huì)導(dǎo)致巨大的回溯。所以:
RewriteRule ^viewshoplatest/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ /viewshoplatest.php?$1=$2&$3=$4&$5=$6&$7=$8&$9=$10&$11=$12&$13=$14&$15=$16
您可以使用RegexBuddy之類的對(duì)象來(lái)查看這些正則表達(dá)式的處理方式不同。
但是由于mod_rewrite只允許引用前九個(gè)組(請(qǐng)參見Tim的答案),因此您可以使用迭代方法并一次處理一個(gè)參數(shù):
RewriteRule ^viewshoplatest/([^/]+)/([^/]+)/([^/]+/[^/]+/.*)$ /viewshoplatest/$3?$1=$2 [QSA,N]RewriteRule ^viewshoplatest/([^/]+)/([^/]+)/([^/]*)/?$ /viewshoplatest.php?$1=$2&$3 [QSA,L]
第一個(gè)規(guī)則將一次處理一個(gè)參數(shù)對(duì)(最后一個(gè)對(duì)除外),方法是將其附加到已存在的參數(shù)對(duì)(請(qǐng)參閱QSA標(biāo)志),然后在不增加內(nèi)部遞歸計(jì)數(shù)器的情況下重新啟動(dòng)重寫過(guò)程(請(qǐng)參閱N標(biāo)志)。然后第二條規(guī)則將重寫最后一個(gè)參數(shù)對(duì)(或僅名稱)并結(jié)束迭代。
但是由于使用N標(biāo)志可能會(huì)很危險(xiǎn),因?yàn)樗赡軐?dǎo)致無(wú)限遞歸,因此您也可以使用PHP解析請(qǐng)求的路徑:
$_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;}
現(xiàn)在,您只需要此規(guī)則即可將請(qǐng)求通過(guò):
RewriteRule ^viewshoplatest(/|$) /viewshoplatest.php [L]

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊
只是為了擴(kuò)展發(fā)現(xiàn)的內(nèi)容,您只能定義九個(gè)組用作反向引用,這就是為什么最好將其重寫為腳本san-query字符串,并在有以下REQUEST_URI
情況時(shí)檢查腳本的原因:大量數(shù)據(jù)需要解析。
從文檔中:
反向引用是形式為$ N(N = 0..9)的標(biāo)識(shí)符,它將由匹配的Pattern的第N組的內(nèi)容替換
$0
是整個(gè)匹配的模式,為您提供其余的九個(gè)數(shù)字。任何更高的數(shù)字都將被視為反向引用,后跟一些文字?jǐn)?shù)字字符。
添加回答
舉報(bào)