2012-04-09 9 views
2

私がやっていることは、.htaccessのErrorDocumentを使って404を傍受し、それをgetFile.phpで指し示すことです。 getFileはurlからファイル名を取得し、mysqlデータベースでファイル名を検索し、データを取得して適切なヘッダーを適用します。PHPで404エラーを正しく傍受するにはどうすればよいですか?

私の開発環境(最新のLAMPサーバーはubuntuで稼動しています)はうまくいくようですが、サイトは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が起きるのを防ぐことはできません。

ありがとうございます! -Jer

+2

は200 OKヘッダを送信することは、通常は悪い習慣です。 –

+0

私はそれを試してみましたが、効果がないようです。フルコードでは、データベースにデータが見つかったときにのみ200を送信します。また、この.htaccessファイルは、このディレクトリにのみ適用され、データベースファイル要求を処理します。他のサイトには影響しません。 – SuperJer

+0

あなたは 'header( 'Content-Disposition:attachment; filename =" download.txt "')を試しましたか? – Travesty3

答えて

4

(のErrorDocument部分なし)あなたの/FILES/dbFiles/.htaccessファイルでこれを試してみてください:

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

これは404を発生させることなく、あなたのgetFile.phpスクリプトにすべての非既存のURLを指示するあなたが出力を行うていることを確認しますスクリプトがデータベース内のコンテンツを見つけられない場合は、404になります。

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

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

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

素晴らしい!それがトリックでした。どうもありがとうございました! – SuperJer

+0

stackoverflowが大好き、ありがとう! –

0

ああ男、素敵なソリューション:あなたのPHPファイル、使用インサイド

。私の状況はこれでした:要求された.jsファイルが存在しなかったときに別のディレクトリからjavascriptコンテンツをストリーミングしていましたが、javascriptの実際のコンテンツは状態が404になっていましたが、ステータスは404です。

何を助け、うまくいけば、それはあまりにも他の人を支援します。ユーザーが不足しているページにアクセスしたとき

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