为了账号安全,请及时绑定邮箱和手机立即绑定

重写任意数量的路径段以查询参数

重写任意数量的路径段以查询参数

冉冉说 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 关注
  • 437 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信