gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:13:11 27 4
gpt4 key购买 nike

我有这个 .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

最佳答案

首先:你不应该使用 .* 如果你能更具体一些,比如在这种情况下 [^/]+。因为多个 .* 会导致巨大的回溯。所以:

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]

关于apache - 重写任意数量的路径段以查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3655893/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com