Ответ 1
Прежде всего: вы не должны использовать .*
, если вы можете быть более конкретным, например, в этом случае [^/]+
. Потому что множественный .*
может привести к огромному возврату назад. Итак:
RewriteRule ^viewshoplatest/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ /viewshoplatest.php?$1=$2&$3=$4&$5=$6&$7=$8&$9=$10&$11=$12&$13=$14&$15=$16
Вы можете использовать взятый как RegexBuddy, чтобы увидеть разницу в том, как обрабатываются эти регулярные выражения.
Но так как mod_rewrite позволяет ссылаться только на первые девять групп (см. Tims 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]