在 apache 中使用查询中的 & 重写 URL

在 apache 中使用查询中的 & 重写 URL

我正在尝试构建重写条件和规则,以重写查询字符串中带有 & 而不是仅带有 & 的 URL。发生这种情况是因为在将 URL 以 XML 格式传输到客户端时出现了一些无效编码。长期来看,这个问题会得到解决,但短期来看,如果我可以制定重写规则,它将阻止 404 错误。

示例 URL 为

https://myserver.com/getpdf/download?md5=53d64aee8107d8f8af0c&id=163464591&tz=GMT

到目前为止我已经得到了这个

RewriteCond %{REQUEST_URI} ^/getpdf/download*
RewriteRule ^/([^&]+)(&)(.*)$ /$1&$2 [N]

根据 serverfault 上的其他帖子(例如mod-rewrite:替换 URL 中的某些字符

我打开了重写日志,这就是我看到的

10.0.0.64 - - [12/Mar/2016:06:42:52 +0000] [myserver.com/sid#7f24e32103e8][rid#7f24e3379870/initial] (2) init rewrite engine with requested uri /getpdf/download
10.0.0.64 - - [12/Mar/2016:06:42:52 +0000] [myserver.com/sid#7f24e32103e8][rid#7f24e3379870/initial] (3) applying pattern '^(md5)([^&]+)(&)(.*)$' to uri '/getpdf/download'
10.0.0.64 - - [12/Mar/2016:06:42:52 +0000] [myserver.com/sid#7f24e32103e8][rid#7f24e3379870/initial] (1) pass through /getpdf/download

关于如何正确形成重写规则的任何指导都将非常有用。

答案1

Apache 文档指出,如果您想重写 URI 的查询字符串部分,那么您需要使用RewriteCond %{QUERY_STRING}

因此,你应该尝试这个:

RewriteCond %{QUERY_STRING} md5=([0-9a-f]{20}(&)(id=[0-9]+)(&)(.*)
RewriteRule ^md5=([0-9a-f]{20}(&)id=([0-9]+)(&)(.*)$ md5=$1&id=$2&$3 [N]

答案2

在 Teros 答案的帮助下,我找到了正确的方向,解决了重写规则。

第一步是匹配 %{QUERY_STRING}。

RewriteCond %{QUERY_STRING} ^md5=([0-9a-f])(&)id=([0-9])(&)(.*)$

第二步是重写整个 URL。我的错误在于我以为我只能修改查询字符串。

RewriteRule ^(.*)$ https://myserver.com/getpdf/download?md5=%1&id=%3&%5 [N]

一些技巧

  • RewriteRule 中的 %1 使用 RewriteCond 中的组
  • $1 将使用 RewriteRule 中的正则表达式中的组
  • Rewrite 使用 Perl 兼容正则表达式 (PCRE)。我使用这个测试器来检查我的正则表达式 -https://regex101.com/#pcre
  • 谷歌“学习 Apache mod_rewrite:13 个真实示例”
  • Apache 重写简介和显示基础知识的图像有助于 -https://httpd.apache.org/docs/2.4/en/rewrite/intro.html(本质上是 RTFM 的一个案例:))

希望这能帮助那些在重写世界中迷失的人。

相关内容