Замена значения параметра querystring с помощью mod_rewrite

Я хотел бы отобразить это:

http://www.example.com/index.php?param1=value1&param2=value2&param3=value3 (etc. ad infinitum) 

в

 http://www.example.com/index.php?param1=newvalue1&param2=value2&param3=value3 (etc.) 

Другими словами, просто измените значение одного параметра в строке запроса. Я знаю, что такое старое значение, поэтому я пытаюсь сопоставить точный текст index.php?param1=value1 и заменить его на index.php?param1=newvalue1 . Кажется, я не могу найти примеров того, как это сделать, используя mod_rewrite. Любая помощь была высоко оценена.

Попробуйте следующее правило:

 RewriteCond %{QUERY_STRING} ^(([^&]*&)*)param1=value1(&.*)?$ RewriteRule ^index\.php$ /index.php?%1param1=newvalue1%3 [L,R=301] 

это своего рода хрупкое решение, поскольку оно зависит от порядка параметров GET, но оно работает для вашего конкретного примера, сохраняет любые аргументы GET после param1, а также сохраняет аргументы POST:

 RewriteCond %{QUERY_STRING} param1=value1(&.*)*$ RewriteRule ^/index\.php$ /index.php?param1=newvalue1%1 [L] 

У меня есть небольшая тестовая php-страница, которая просто делает print_r($_GET) и print_r($_POST) и используя curl из командной строки с post args, я вижу следующее:

 $ curl --data "post1=postval1&post2=postval2" "http://www.example.com/index.php?param1=value1&param2=value2&param3=value3" _GET Array ( [param1] => newvalue1 [param2] => value2 [param3] => value3 ) _POST Array ( [post1] => postval1 [post2] => postval2 ) 

если вы хотите, чтобы условие перезаписи было более гибким, вы могли бы добавить некоторые условные шаблоны, такие как Gumbo, но было бы полезно точно знать, какие условия вам нужно обрабатывать (т. е. может ли param1 быть в любой позиции, может ли он быть единственным get arg, и т.д.)

изменить для новых требований ниже

как представляется, работает для замены «value1» на «newvalue1» в любом месте строки запроса или URL-адреса (но не в post'ed keys / values):

 RewriteCond %{QUERY_STRING} ^(.*)value1(.*)$ RewriteRule ^(.*)$ $1?%1newvalue1%2 [L] RewriteRule ^(.*)value1(.*)$ $1newvalue1$2 [L] 

% N используется для подстановки значений из RewriteCond, а $ N используется для подстановки значений из самого RewriteRule. просто использовали два RewriteRules, один из них с ассоциированным RewriteCond для обработки строки запроса.