Apache-2.2

重定向會導致 HTTP 400(錯誤請求)錯誤的請求 (Apache 2.2)

  • March 7, 2010

由於 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。問題是,現在我有一堆在 Google 中被編入索引並從其他網站連結到的 URL。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 沒有任何影響。有沒有人遇到過這個問題?任何可能的解決方案?

謝謝!

克里斯

您可以為 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
...

因此,您確實獲得了足夠的資訊來進行適當的狀態程式碼更改和位置重定向。

引用自:https://serverfault.com/questions/118470