我需要帮助重写URL,因为我需要将所有查询字符串值连接到一个与+符号连接的单个参数,并将= =替换为:
这样的链接
http://domain.com/mypage?p1=v1&p2=v2&p3=v3
会变成
http://domain.com/mypage?params=p1:v1+p2:v2+p3:v3
(编辑:我更改页面名称,删除.php)
答案 0 :(得分:0)
首先,这个问题最好通过mod_rewrite解决。如果可以,您应该修改接收端(您不能)或修改发送端(您可能能够)来发送正确的数据。如果您碰巧知道可能出现在网址中的所有参数名称,则可以改为使用this question。
您可以将查询字符串与%{QUERY_STRING}
中的RewriteCond
变量进行匹配。然后,您在内部使用该查询字符串重写为URL。
RewriteEngine on
RewriteCond %{QUERY_STRING} !params=
RewriteRule ^sillyframework/sillypage$ sillyframework/sillypage?%{QUERY_STRING}¶ms=
RewriteCond %{QUERY_STRING} ^([^&=]+)=([^&]+)¶ms=([^&=]*)$
RewriteRule ^sillyframework/sillypage$ sillyframework/sillypage?params=%3+%1:%2 [L]
RewriteCond %{QUERY_STRING} ^([^&=]+)=([^&]+)&(.*)¶ms=([^&=]*)$
RewriteRule ^sillyframework/sillypage$ sillyframework/sillypage?%3¶ms=%4+%1:%2 [L]
这种方法存在一个问题,它需要多次内部递归来转换查询字符串中的所有参数。为什么这么糟糕?每次递归都需要时间。为了保护服务器,允许的默认递归量为10,之后您将收到内部服务器错误。可以通过增加限制或使用[N]
标志来绕过此递归限制。 [N]
标志是一个非常糟糕的主意,与递归限制的严格选择限制一样多。 Apache不会使用N标志以不正确的规则终止,因此对使用它的规则的特制请求可以让mod_rewrite dos成为您自己的服务器。一个错误选择(高值)的InternalRecursionLimit基本上做同样的事情。 mod_rewrite不会显示内部服务器错误,而是会在达到该限制之前炸毁服务器。 N
标记与限制之间的差异在于,InternalRecursionLimit
和L
的较高值理论上最终会达到该限制,N
不会这样做。
答案 1 :(得分:0)
由于查询字符串没有固定的数字/名称参数,我决定编写一个CGI脚本来进行转换,然后重定向到修改后的URL。
非常感谢你的帮助。