我有一个服务器,其中一些文件的名称中有一个实际的 %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”有点丢弃。
问题:
转义是关键,它使用这个规则:
RewriteRule (.*)\ (.*) $1\%2520$2
但只有在初始url中有一个 “%20”的情况下才有效; 如果有多个,我会得到一个“内部服务器错误”。
看起来我差不多有…请帮忙:-)
我能够使用以下规则使它工作两个空格:
RewriteRule (.*)\ (.*)\ (.*) $1\%2520$2\%2520$3
这足够满足我的需求,因为工具生成的URL最多只能包含两个“%20”; 但出于好奇:有没有办法使这个工作与任何数量的空间? 它与第一条规则一起使用,如果用正常字符replace任意数量的空格,则只有在涉及特殊字符时才会发生此问题。
%正被读作反向引用,所以你需要转义%。