【问题标题】:How do I intercept a 404 error in PHP properly?如何正确拦截 PHP 中的 404 错误?
【发布时间】: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


【解决方案1】:

在您的 /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。 p>

在您的 PHP 文件中,使用:

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

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

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

【讨论】:

    【解决方案2】:

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

    对于我来说,这是有帮助的,希望它也可以帮助其他人:

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

    【讨论】:

      猜你喜欢
      • 2013-06-17
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多