Apache 重写规则和特殊字符

Apache 重写规则和特殊字符

我有一台服务器,其中某些文件有实际的 %20在其名称中(它们是由以这种方式处理空格的自动化工具生成的,我对此无能为力);这不是空格:它是“%”后跟“2”后跟“0”。

在此服务器上,有一个 Apache Web 服务器,并且有一些网页链接到这些文件,并在 URL 中使用它们的名称,例如http://servername/file%20with%20a%20name%20like%20this.html;这些页面是由同一工具生成,所以我(再次!)对此无能为力。在这里,对所有文件、页面和 URL 进行全面搜索和替换是不可能的。

问题:当 Apache 使用上述 URL 调用时,它(正确地)将“%20”转换为空格然后它当然找不到文件,因为它们没有实际的空格以他们的名义。

我该如何解决这个问题?

我发现使用类似的 URLhttp://servername/file%2520name.html效果会更好,因为 Apache 会将“%25”转换为“%”符号,从而构建正确的文件名。

我尝试使用 Apache 重写规则,并且可以成功地用连字符替换空格,语法如下:

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

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

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

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

问题:

  • 我如何构建这样的正则表达式来用“%2520”替换空格?
  • 这是我能解决这个问题的唯一方法吗(除了完整的搜索和替换,正如我所说,这是无法做到的),或者你有更好的想法吗?

编辑:

逃避是关键,它使用以下规则:

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

但它只有在初始 URL 中有“%20”;如果有多个,我会收到“内部服务器错误”。

看起来我快到了...请帮忙:-)


编辑2:

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

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

这足以满足我的需求,因为该工具生成的 URL 最多只能包含两个“%20”;但是,出于好奇:有没有办法让它适用于任意数量的空格?如果用普通字符替换任意数量的空格,它适用于第一条规则,只有涉及特殊字符时才会出现此问题。

答案1

% 被读取为反向引用,因此您需要转义 %。

相关内容