【问题标题】:Replacing all ampersand character in query string替换查询字符串中的所有 & 字符
【发布时间】:2014-11-22 00:14:38
【问题描述】:

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

这样的链接

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

会变成

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

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

【问题讨论】:

  • 这是可能的,但使用 PHP 会更有效。你为什么要使用 htaccess 和 mod_rewrite 呢?
  • 该页面实际上不是PHP,我以这个名称为例。我需要使用我无法更改的库。
  • p1、p2、p3 是固定的吗(它们总是这样命名的)?它们都是必需的吗?

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


【解决方案1】:

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

您可以将查询字符串与RewriteCond 中的%{QUERY_STRING} 变量匹配。然后,您在内部使用该查询字符串重写为 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 执行您自己的服务器。选择不当(高值)的 InternalRecursionLimit 基本上也是如此。 mod_rewrite 不会显示内部服务器错误,而是会在服务器达到该限制之前炸毁服务器。 N 标志和限制之间的区别在于,InternalRecursionLimitL 的高值理论上最终会达到该限制,而 N 不会这样做。

【讨论】:

  • 请注意,我尚未测试这些规则,因为我无法从该领域访问 Apache 服务器。如果我没有完全搞砸它应该可以工作。如果它不起作用,请尝试添加 DPI 标志。如果还是不行,那就怪别人,而不是我。另外:该框架不一定需要很傻才能工作。独角兽可能会也可能不会包含在此解决方案中。
【解决方案2】:

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

非常感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2014-07-03
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    相关资源
    最近更新 更多