Apache重写规则和特殊字符

我有一个服务器,其中一些文件的名称中有一个实际的 %20 (它们是由一个自动化的工具来处理空间,我不能做任何事情)。 这不是空格:它是“%”,后跟“2”,后面是“0”。

在这个服务器上,有一个Apache Web服务器,并且有一些网页链接到这些文件,使用他们的名字在像http://servername/file%20with%20a%20name%20like%20this.html ; 那些页面也是由同一个工具生成的,所以我(再次!)对此无能为力。 对所有文件,页面和URL进行全面的search和replace是不成问题的。

问题是:当Apache被上面的URL调用时,它(正确地)将“%20”翻译成空格 ,然后当然找不到这些文件,因为它们没有实际的空格他们的名字。

我该如何解决这个问题?

我发现比使用像http://servername/file%2520name.html这样的URL更好,因为Apache会将“%25”转换为“%”符号,从而build立正确的文件名。

我尝试使用Apache重写规则,我可以用这样的语法成功replace空间:

 RewriteRule (.*)\ (.*) $1-$2 

问题是:当我尝试用“%2520”序列replace它们时,这不会发生。 如果我使用

 RewriteRule (.*)\ (.*) $1%2520$2 

那么得到的URL是http://servername/file520name.html ; 我也尝试了“%25”,但是我只得到了“5”。 它看起来像最初的“%2”有点丢弃。

问题:

  • 我如何build立这样的正则expression式来replace“%2520”的空格?
  • 这是我能处理这个问题的唯一方法吗(除了像我所说的那样,不能完全search和replace)或者你有什么更好的想法吗?

编辑:

转义是关键,它使用这个规则:

 RewriteRule (.*)\ (.*) $1\%2520$2 

但只有在初始url中有一个 “%20”的情况下才有效; 如果有多个,我会得到一个“内部服务器错误”。

看起来我差不多有…请帮忙:-)


编辑2:

我能够使用以下规则使它工作两个空格:

 RewriteRule (.*)\ (.*)\ (.*) $1\%2520$2\%2520$3 

这足够满足我的需求,因为工具生成的URL最多只能包含两个“%20”; 但出于好奇:有没有办法使这个工作与任何数量的空间? 它与第一条规则一起使用,如果用正常字符replace任意数量的空格,则只有在涉及特殊字符时才会发生此问题。

%正被读作反向引用,所以你需要转义%。