替换查询字符串中的所有&符号

时间:2014-09-26 21:50:33

标签: apache mod-rewrite url-rewriting query-string

我需要帮助重写URL,因为我需要将所有查询字符串值连接到一个与+符号连接的单个参数,并将= =替换为:

这样的链接

http://domain.com/mypage?p1=v1&p2=v2&p3=v3

会变成

http://domain.com/mypage?params=p1:v1+p2:v2+p3:v3

(编辑:我更改页面名称,删除.php)

2 个答案:

答案 0 :(得分:0)

首先,这个问题最好通过mod_rewrite解决。如果可以,您应该修改接收端(您不能)或修改发送端(您可能能够)来发送正确的数据。如果您碰巧知道可能出现在网址中的所有参数名称,则可以改为使用this question

您可以将查询字符串与%{QUERY_STRING}中的RewriteCond变量进行匹配。然后,您在内部使用该查询字符串重写为URL。

RewriteEngine on

RewriteCond %{QUERY_STRING} !params=
RewriteRule ^sillyframework/sillypage$ sillyframework/sillypage?%{QUERY_STRING}&params=

RewriteCond %{QUERY_STRING} ^([^&=]+)=([^&]+)&params=([^&=]*)$
RewriteRule ^sillyframework/sillypage$ sillyframework/sillypage?params=%3+%1:%2 [L]

RewriteCond %{QUERY_STRING} ^([^&=]+)=([^&]+)&(.*)&params=([^&=]*)$
RewriteRule ^sillyframework/sillypage$ sillyframework/sillypage?%3&params=%4+%1:%2 [L]

这种方法存在一个问题,它需要多次内部递归来转换查询字符串中的所有参数。为什么这么糟糕?每次递归都需要时间。为了保护服务器,允许的默认递归量为10,之后您将收到内部服务器错误。可以通过增加限制或使用[N]标志来绕过此递归限制。 [N]标志是一个非常糟糕的主意,与递归限制的严格选择限制一样多。 Apache不会使用N标志以不正确的规则终止,因此对使用它的规则的特制请求可以让mod_rewrite dos成为您自己的服务器。一个错误选择(高值)的InternalRecursionLimit基本上做同样的事情。 mod_rewrite不会显示内部服务器错误,而是会在达到该限制之前炸毁服务器。 N标记与限制之间的差异在于,InternalRecursionLimitL的较高值理论上最终会达到该限制,N不会这样做。

答案 1 :(得分:0)

由于查询字符串没有固定的数字/名称参数,我决定编写一个CGI脚本来进行转换,然后重定向到修改后的URL。

非常感谢你的帮助。