基本上,我正在做的是使用.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
答案 0 :(得分:4)
在/FILES/dbFiles/.htaccess
文件中尝试此操作(不带ErrorDocument部分):
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]