如何正确拦截PHP中的404错误?

时间:2012-04-09 19:40:07

标签: php http-headers http-status-code-404 errordocument

基本上,我正在做的是使用.htaccess中的ErrorDocument拦截404,并将其指向getFile.php。 getFile然后从url中获取文件名,并在mysql数据库中搜索它,获取数据并应用适当的头文件。

在我的开发环境(在ubuntu下运行的最新LAMP服务器)一切似乎都运行正常,但该网站正在GoDaddy上托管,并且返回的标头似乎存在一些问题。我认为GoDaddy会返回404,然后无论如何都要发送数据。

结果是当我右键单击要以这种方式处理的链接时,我可以“另存为”,一切正常。如果文件是图像,则打开没有问题。但是,如果我只是点击链接,它是一个要下载而不是在浏览器中查看的文件,我会在所有浏览器中收到“找不到文件”错误。无论文件是否成功传输,Firebug控制台都声称它是404错误。我的代码如下:

$folder = explode( "/" , $_SERVER["REQUEST_URI"] );
$pageName = $folder[sizeof($folder)-1];

$sql = "SELECT data, mimeType, OCTET_LENGTH(data) AS size FROM tblFiles WHERE fileName = '".$pageName."' AND active=1;";

$result = mysql_query("$sql") or die();

$data = mysql_fetch_array($result);

header("HTTP/1.0 200 OK");
header("Content-Type: ".$data['mimeType']);
header("Content-Length: ".$data['size']);

echo $data['data'];

.htaccess文件:

ErrorDocument 404 /FILES/dbFiles/getFile.php

现在这是/ FILES / dbFiles中的完整.htaccess文件。我不知道GoDaddy是否期待更多东西,但它似乎就像在我自己​​的服务器上写的一样。

我尝试了多种标题信息组合,没有任何正面效果。

我的代码显然有效,但我似乎无法阻止404发生。

谢谢! -Jer

2 个答案:

答案 0 :(得分:4)

/FILES/dbFiles/.htaccess文件中尝试此操作(不带Erro​​rDocument部分):

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ getFile.php?file=$0 [QSA,L]

这会将所有不存在的网址指向您的getFile.php脚本而不生成404.如果脚本未在您的数据库中找到内容,请确保输出 404。

在PHP文件中,使用:

if(@$_GET['file']) {

    //Your code here.  Use $_GET['file'] instead of $_SERVER["REQUEST_URI"]

} else {
    //Weird.  This file was directly accessed.
    die();
}

答案 1 :(得分:0)

哦,伙计,好的解决方案。我的情况是这样的:当一个请求的.js文件不存在时,我正在从另一个目录中传输javascript内容,而当javascript的实际内容恢复正常时,状态为404.

就我的目的而言,这是有帮助的,希望它也有助于其他人:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) route/index.php [L,QSA]