我有这个.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 :(得分: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]
第一个规则将一次处理一个参数对(最后一对除外),将其附加到已存在的参数对(参见 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]
答案 1 :(得分:3)
为了扩展您发现的内容,您只能定义九个组作为反向引用,这就是为什么通常更好的方法是重写脚本sans-query字符串并让脚本检查{{1}在你需要解析大量数据的情况下。
反向引用是。的标识符 形成$ N(N = 0..9),这将是 取而代之的是Nth的内容 匹配模式的组
REQUEST_URI
是整个匹配的模式,为您提供剩余的九个数字。任何更高的数字都被视为反向引用,后跟一些文字数字字符。