2014-09-26 64 views
1

我需要帮助重写URL,因为我需要所有的查询字符串值拼接与+号和更换串接一个参数=签署:查询字符串更换所有符号字符

所以这样

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

将成为

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

(编辑:我改变页面名称,删除.PHP)

+0

这是可能的,但用PHP做它会更有效率。你为什么要使用htaccess和'mod_rewrite'呢? – 2014-09-27 10:49:42

+0

页面实际上并不在PHP中,我使用这个名称作为示例。我需要使用一个我无法改变的库。 – 2014-09-27 16:24:12

+0

p1,p2,p3是否固定(ala是否总是这样命名)?它们都是必需的吗? – Sumurai8 2014-09-27 16:56:07

回答

0

由于查询字符串不会有固定的number/name参数,我决定编写一个CGI脚本来完成转换,然后重定向到修改后的url。

非常感谢您的帮助。

0

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

您可以将查询字符串与RewriteCond中的%{QUERY_STRING}变量进行匹配。然后您使用该查询字符串在内部重新编写一个网址。

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做你自己的服务器。 InternalRecursionLimit的严重选择(高值)基本上是一样的。服务器不会显示内部服务器错误,而会在服务器达到该限制之前炸掉服务器。 N标志与限制之间的差异在于理论上InternalRecursionLimitL的高值将最终达到该限制,其中N不会这样做。

+0

请注意,我还没有测试过这些规则,因为我没有从这个领域访问Apache服务器。如果我没有完全搞砸它应该可以工作。如果不起作用,请尝试添加'DPI'标志。如果它仍然行不通,责怪别人,而不是我。另外:框架并不一定需要愚蠢才能发挥作用。独角兽可能会或可能不会包含在此解决方案中。 – Sumurai8 2014-09-27 17:29:40