【发布时间】:2012-04-22 03:42:30
【问题描述】:
本质上,我正在做的是使用 .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 发生。
谢谢! -杰尔
【问题讨论】:
-
当用户访问丢失的页面时发送 200 OK 标头通常是不好的做法。
-
有没有试过,好像没有效果。在完整代码中,只有在数据库中找到数据时才发送 200。此外,这个 .htaccess 文件只适用于这个目录,用于处理数据库文件请求。它不会影响网站的其他部分。
-
你试过
header('Content-Disposition: attachment; filename="download.txt"');吗? -
是的,我有。一样。似乎 GoDaddy 在我尝试发送的任何标头信息之前发送 404,所以我有点倾向于 .htaccess 文件的问题。
-
也许可以给 GoDaddy 发邮件问问他们是如何处理 404 的
标签: php http-headers http-status-code-404 errordocument