redirect导致HTTP 400(错误请求)错误(Apache 2.2)的请求

由于Wordpress中存在安全漏洞,我的一些post被重命名为:

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。 谷歌最终将他们从他们的索引中删除,但在此期间,我想重写错误的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]

当我在正则expression式工具中testing时,它匹配,但似乎没有任何区别于Apache。 有没有人遇到过这个问题? 任何可能的解决

谢谢!

克里斯

你可以像这样为400个错误定义一个自定义的ErrorDocument:

 ErrorDocument 400 /cgi-bin/handle400.cgi 

然后让那个CGI(或者PHP或者servlet或者其他)来做头部重写和位置redirect。

编辑:因为Jacek的答案我刚刚testing解决scheme,以确认它在Apache 2.2上的作品。

我的服务器configuration:

 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错误请求的错误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 ... 

所以你得到足够的信息来做一个适当的状态代码更改和位置redirect。

“400错误请求”表示请求被破坏,服务器无法parsing/理解。 这意味着服务器没有来自请求的数据(甚至是URL),所以没有任何mod_rewrite或任何其他工具处理请求数据能够做到这一点。