用& amp; amp; apache来重写apache中的URL 在查询中

我正在尝试构build一个重写条件和规则,用& 在查询string中,而不仅仅是&。 当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:replaceurl中的一些字符 )

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

 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 

任何关于如何正确地形成重写小册子的指导都是很好的。

Apache文档指出,如果要重写URI的查询string部分,则需要使用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] 

在Teros的帮助下,我指出了正确的方向,我解决了我的重写规则。

第一步是匹配%{QUERY_STRING}。

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

第二步是重写整个URL。 我的错误是认为我只能修改查询string。

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

一些技巧

  • RewriteRule中的%1使用RewriteCond中的组
  • $ 1将使用RewriteRule中的正则expression式组
  • 重写使用Perl兼容正则expression式(PCRE)。 我使用这个testing来检查我的正则expression式 – https://regex101.com/#pcre
  • Google“学习Apache mod_rewrite:13个真实世界的例子”
  • 重写Apache的介绍,以及显示基础的图像帮助 – https://httpd.apache.org/docs/2.4/en/rewrite/intro.html (本质上是一个RTFM的情况:))

希望这有助于别人在重写的世界中迷失。