2

基本的に、私が行っているのは、.htaccessのErrorDocumentを使用して404をインターセプトし、getFile.phpにポイントすることです。次に、getFileはURLからファイル名を取得し、mysqlデータベースでそれを検索して、データを取得し、適切なヘッダーを適用します。

私の開発環境(ubuntuで実行されている最新のLAMPサーバー)では、すべてが正常に機能しているように見えますが、サイトはGoDaddyでホストされており、返されるヘッダーに問題があるようです。GoDaddyは404を返し、とにかくデータを送信すると思います。

その結果、この方法で処理されるリンクを右クリックすると、[名前を付けて保存]を実行でき、すべてが正常に機能します。ファイルが画像の場合、問題なく開きます。しかし、リンクをクリックするだけで、ブラウザで表示するのではなくダウンロードするファイルである場合、すべてのブラウザで「ファイルが見つかりません」というエラーが発生します。Firebug Consoleは、ファイルが正常に転送されたかどうかに関係なく、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]

これにより、404を生成せずに、存在しないすべてのURLがスクリプトに転送されます。スクリプトがデータベース内のコンテンツを見つけられない場合は、getFile.php必ず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 に答える