亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

重寫任意數量的路徑段以查詢參數

重寫任意數量的路徑段以查詢參數

冉冉說 2019-09-26 15:21:12
重寫任意數量的路徑段以查詢參數我有這個.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
查看完整描述

2 回答

?
浮云間

TA貢獻1829條經驗 獲得超4個贊

首先:.*如果可以更具體,則不應該使用,例如在這種情況下[^/]+。因為多個.*會導致巨大的回溯。所以:

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

您可以使用RegexBuddy之類的對象來查看這些正則表達式的處理方式不同。

但是由于mod_rewrite只允許引用前九個組(請參見Tim的答案),因此您可以使用迭代方法并一次處理一個參數:

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

第一個規則將一次處理一個參數對(最后一個對除外),方法是將其附加到已存在的參數對(請參閱QSA標志),然后在不增加內部遞歸計數器的情況下重新啟動重寫過程(請參閱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]


查看完整回答
反對 回復 2019-09-26
?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

只是為了擴展發現的內容,您只能定義九個組用作反向引用,這就是為什么最好將其重寫為腳本san-query字符串,并在有以下REQUEST_URI情況時檢查腳本的原因:大量數據需要解析。

文檔中

反向引用是形式為$ N(N = 0..9)的標識符,它將由匹配的Pattern的第N組的內容替換

$0是整個匹配的模式,為您提供其余的九個數字。任何更高的數字都將被視為反向引用,后跟一些文字數字字符。


查看完整回答
反對 回復 2019-09-26
  • 2 回答
  • 0 關注
  • 508 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號