2012-04-09 3 views
2

본질적으로, 내가하고있는 일은 .htaccess에서 ErrorDocument를 사용하여 404를 가로 채고 getFile.php를 가리키는 것입니다. 그런 다음 getFile은 url에서 파일 이름을 가져 와서 mysql 데이터베이스에서 해당 파일 이름을 검색하여 데이터를 가져 와서 적절한 헤더를 적용합니다.PHP에서 404 오류를 올바르게 가로채는 방법은 무엇입니까?

우분투에서 실행되는 최신 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 오류가 발생하는 것을 막을 수는 없습니다.

감사합니다. -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입니다. 당신의 PHP 파일 내부

는 사용

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

오 남자, 좋은 솔루션을. 내 상황은 다음과 같습니다. 요청한 .js 파일이 존재하지 않았을 때 다른 디렉토리에서 자바 스크립트 콘텐츠를 스트리밍하고 자바 스크립트의 실제 콘텐츠가 정상적으로 반환되는 동안 상태는 404였습니다.

무엇이 도움이 되었습니까? 다른 사람들에게도 도움이 되었기를 바랍니다.

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