使用mod_rewrite替换查询字符串参数值

时间:2009-09-30 10:07:45

标签: php mod-rewrite replace query-string parameters

我想映射一下:

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执行此操作的示例。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:7)

尝试此规则:

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

答案 1 :(得分:2)

这是一种脆弱的解决方案,因为它取决于GET参数的顺序,但它适用于您的特定示例,保留param1之后的任何GET参数并保留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可以在任何位置,它是否是唯一的得到arg等。)

修改以下新要求

以下似乎适用于在查询字符串或网址中的“newvalue1”替换“value1”(但不在post'ed键/值中):

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

RewriteRule ^(.*)value1(.*)$ $1newvalue1$2 [L]

%N用于替换RewriteCond中的值,而$ N用于替换RewriteRule本身的值。刚刚使用了两个RewriteRules,其中一个与关联的RewriteCond一起处理查询字符串。