由于 Wordpress 存在安全漏洞,我的许多帖子被重命名为如下名称:
http://**MYSITE**/2008/08/21/**POSTNAME**/%&%28%7B$%7Beval%28base64_decode%28$_SERVER%5BHTTP_EXECCODE%5D%29%29%7D%7D%7C.+%29&%/
我已经修复了这个问题,升级了 Wordpress,并将我的 Web 服务器升级到了 Apache 2.2.3。问题是,现在我有一堆 URL 被 Google 编入索引,并链接到其他网站。Google 最终会将它们从索引中删除,但与此同时,我想将错误的 URL 重写为正确的 URL。
我尝试了以下 mod_rewrite 规则,但似乎不起作用。Apache 似乎将该请求视为“错误”,并且直接返回 HTTP 400 错误,而从未咨询 mod_rewrite(或 mod_redirect)。以下是我尝试过的规则:
RewriteRule ^(20[0-9]{2}/[0-1][0-9]/[0-3][0-9]/[^/]+)/.*base64.*$ http://***MYSITE***/$1 [L,R=302,QSA]
当我在正则表达式工具中测试它时,它匹配,但对 Apache 来说似乎没有任何影响。有人遇到过这个问题吗?有什么可能的解决办法吗?
谢谢!
克里斯
答案1
您可以为 400 错误定义自定义 ErrorDocument,如下所示:
ErrorDocument 400 /cgi-bin/handle400.cgi
然后让该 cgi(或 php 或 servlet 或其他)执行标头重写和位置重定向。
编辑:由于 Jacek 的回答,我刚刚测试了上述解决方案以确认它适用于 Apache 2.2。
我的服务器配置:
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
ErrorDocument 400 /cgi-bin/handle400.pl
lukas$ cat /var/www/cgi-bin/handle400.pl
#!/usr/bin/perl
print "Content-type: text/html\n\n";
while (my ($key, $val) = each %ENV) {
print "$key = $val<BR>\n";
}
exit 0;
现在,当访问之前会产生错误 400 Bad Request 的损坏 URL 时,我得到以下(部分)输出:
...
REDIRECT_REQUEST_METHOD = GET
REDIRECT_STATUS = 400
REMOTE_ADDR = xx.xx.xx.xx
REQUEST_URI = /%&%28%7B$%7Beval%28base64_decode%28$_SERVER%5BHTTP_EXECCODE%5D%29%29%7D%7D%7C.+%29&%/
GATEWAY_INTERFACE = CGI/1.1
SCRIPT_URL = /cgi-bin/handle400.pl
...
因此,您确实获得了足够的信息来执行正确的状态代码更改和位置重定向。
答案2
“400 错误请求”表示请求已损坏,服务器无法解析/理解。这意味着服务器没有来自请求的数据(甚至 URL),因此 mod_rewrite 或任何其他处理请求数据的工具都无法对此进行处理。