Apache переписать строку запроса (массив флажков) - PullRequest
4 голосов
/ 14 декабря 2010

Как можно переписать строку запроса, например:

test.php?cat1[]=18&cat1[]=687&xxx[]=5&xxx[]=3&xxx[]=1&yyy[]=6

до

test.php?cat1=18,687,5&xxx=3,1&yyy=6

Обратите внимание, что параметры (пары имя и значение) генерируются динамически.

Ответы [ 4 ]

8 голосов
/ 22 ноября 2011

Вот короткий скрипт php, который создает желаемую строку запроса.Лучше не выполнять эту часть, используя mod_rewrite, потому что он просто выходит за пределы этой области:

<?php

$ret = "";
foreach($_GET as $key=>$val) {
  if(is_array($val)) {
    // Create the comma separated string
    $value = $val[0];
    $length = count($val);
    for($i=1; $i < $length; $i++) {
      $value .= ',' . $val[$i];
    }
    $ret .= "$key=$value&";
  } else {
    $ret .= "$key=$val&";
  }
}

// Remove last '&'
$ret = substr($ret , 0, strlen($ret)-1);

// Redirect the browser
header('HTTP/1.1 302 Moved');
header("Location: /test.php?" . $ret);

?>

Если вы, например, сохраните этот скрипт как /rewrite.php, то вы можете включить эти правила в .htaccess.файл для перенаправления запросов со строками запроса, содержащими массивы, на /rewrite.php:

RewriteCond %{QUERY_STRING} \[\]
RewriteRule ^test.php /rewrite.php [L,QSA]

Затем сценарий rewrite.php перезапишет строку запроса и перенаправит браузер с объединенной строкой запроса.

3 голосов
/ 28 ноября 2011
if (preg_match('/[\][]/',$_SERVER['QUERY_STRING'])) {
  foreach ($_GET as $key => &$val) {
    $_GET[$key] = is_array($val) ? implode(',', $val) : $val;
  }
  header('Location: test.php?'.rawurldecode(http_build_query(array_filter($_GET))));
}
1 голос
/ 23 ноября 2011

test.php? Cat1 = 18,687,5 & ххх = 3,1 & ууу = 6

попробуйте вставить эту функцию перед вашим кодом:

url_parsestring2array(& $_GET);

function url_parsestring2array($args)
{
    if (empty($args) || !is_array($args) || !$args) {
        return;
    }
    foreach ($args as $key => $val) {
        $tmp = explode(',', $val);
        if (count($tmp) > 1) {
            $args[$key] = $tmp;
        }
    }
}

var_dump($_GET);

напечатает

array (3) {["cat1"] => array (3) {[0] => string (2) "18" [1] => string (3) "687" [2] => string (1) "5"} ["xxx"] => array (2) {[0] => string (1) "3" [1] => string (1) "1"} ["yyy"] => string (1) "6"}

0 голосов
/ 28 ноября 2011

Я нашел решение сделать это преобразование без изменения кода.

В httpd.conf (в моем разделе VirtualHost ) я определяю карту перезаписи:

RewriteMap programmap prg:/var/www/localhost/htdocs/chg.php

Затем в .htaccess я установил следующие правила:

RewriteEngine On

RewriteCond %{QUERY_STRING} (.*)
RewriteRule ^(script.php) $1?${programmap:%1} [L]

$ 1 обозначает первый "()" в RewriteRule

% 1 обозначает первый "()" в RewriteCond

Затем я пишу этот скрипт " / var / www / localhost / htdocs / chg.php " (в PHP, но может быть на C, Perl или whatelse):

#!/usr/bin/php -f
<?php
$pos1 =  2;
$pos2 =  $pos1 + 1;
$reg = '/(([a-z0-9_]+)\[\]=([^&]*))/';
while(true){
        $res=array();
        $buff = trim(fgets(STDIN));
        if(feof(STDIN)){
                break;
        }
        $r = preg_match_all($reg, $buff, $match,PREG_SET_ORDER);
        if($r){
                foreach($match as $row){
                        if(!isset($res[$row[$pos1]])){
                                $res[$row[$pos1]] = $row[$pos1]."=".$row[$pos2];
                        } else {
                                $res[$row[$pos1]] .= ",".$row[$pos2];
                        }
                }
                $out=join('&',$res);
        } else {
                $out=$buff;
        }
        echo "$out\n";
}
...