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

Posted

技术标签:

【中文标题】使用 mod_rewrite 替换查询字符串参数值【英文标题】:Replacing a querystring parameter value using mod_rewrite 【发布时间】:2010-12-02 14:27:26 【问题描述】:

我想映射这个:

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

【问题讨论】:

【参考方案1】:

试试这个规则:

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

【讨论】:

几乎做到了!只是附加参数没有标记到末尾(param2、param3 等) @Russ:小错字:使用%3 而不是%4 这是一种享受,非常感谢。只要我有足够高的声望,我就会添加一个投票(直到我达到 15 岁才会让我投票给你)。 实际上,仍然是一个小问题-尽管它可以与 [R=301] 一起使用,但如果我将其取出(尝试进行透明重定向),它将不再有效-规则似乎被完全忽略了。 顺便说一句,我可能应该补充一点,我还想在此重定向期间保留任何 POST 值。我了解使用 mod_rewrite 重定向到内部页面应该保留发布数据,但在这种情况下它不起作用 - 重定向后仅存在 GET 数据。【参考方案2】:

这是一种脆弱的解决方案,因为它取决于 GET 参数的顺序,但它适用于您的具体示例,在 param1 之后保留任何 GET args 并且还保留 POST args:

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 等)

修改以下新要求

以下内容似乎适用于在查询字符串或 url 中的任何位置(但不适用于已发布的键/值)中的“value1”替换为“newvalue1”:

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

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

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

【讨论】:

实际上,需求已经发生了一些变化——现在我只想用另一个文本字符串替换一个文本字符串。该字符串可以出现在 URL 中的任何位置(即在查询字符串中或作为路径的一部分)。所以我想改变:mydomain.com/string1/string2/string3 到 mydomain.com/string1/new_string2/string3 以及 mydomain.com/… 到 mydomain.com/…

以上是关于使用 mod_rewrite 替换查询字符串参数值的主要内容,如果未能解决你的问题,请参考以下文章

mod_rewrite:将路径和查询字符串 URL 作为参数传递

ini 使用mod_rewrite(和mod_setenvif)通过temp env vars操作查询字符串参数的示例

mod_rewrite 匹配编码的 URL

mod_rewrite urlencoding 一个已经 urlencoded 的查询字符串参数 - 有啥方法可以禁用它?

Mod_rewriting 将查询字符串写入 swf 文件

在javascript中搜索和替换特定的查询字符串参数值