我想映射一下:
http://www.example.com/index.php?param1=value1¶m2=value2¶m3=value3 (etc. ad infinitum)
到
http://www.example.com/index.php?param1=newvalue1¶m2=value2¶m3=value3 (etc.)
换句话说,只需更改查询字符串中单个参数的值即可。我知道旧的价值是什么,因此我尝试匹配确切的文字index.php?param1=value1
并将其替换为index.php?param1=newvalue1
。我似乎无法找到任何关于如何使用mod_rewrite执行此操作的示例。非常感谢任何帮助。
答案 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¶m2=value2¶m3=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一起处理查询字符串。