2

本质上,我正在做的是使用 .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 发生。

谢谢!-杰尔

4

2 回答 2

4

在你的文件中试试这个/FILES/dbFiles/.htaccess(没有 ErrorDocument 部分):

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

这会将所有不存在的 URL 定向到您的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();
}
于 2012-04-09T20:25:40.207 回答
0

哦,伙计,很好的解决方案。我的情况是这样的:当请求的 .js 文件不存在时,我正在从另一个目录流式传输 javascript 内容,虽然 javascript 的实际内容返回得很好,但状态是 404。

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

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) route/index.php [L,QSA]
于 2012-07-29T07:22:19.717 回答