2014-12-11 1 views
4

OK, 처음에는 사과드립니다. 이전에 여러 번 다루어 졌던 주제입니다. - 믿어주세요. 이전의 질문과 대답을 모두 읽었지만 여전히 얻을 수 없습니다. 이게 작동합니다.웹 루트 외부의 파일 다운로드

다운로드 할 수있는 파일이있는 폴더가 있습니다. 보안상의 이유로이 파일은 웹 루트 외부에 있습니다. 그러나, 최선의 노력에도 불구하고, 내 PHP 스크립트 파일을 다운로드받을 수 없습니다.

나는 다음과 같이 (간체) 파일 구조가 Plesk를 11

를 사용하여 리눅스 VPS 아파치 서버를 사용하고 있습니다. httpdocs 폴더가 웹 루트입니다. private/uploadedfiles 폴더에서 다운로드 할 위치입니다.

-var 
- www 
    - vhosts 
    - mydomain.org.uk 
    - httpdocs (webroot) 
    - private 
    - uploadedfiles 

나는 downloadscript.php라는 PHP 스크립트 파일 이름을 전달하는 jQuery를 아약스 호출을 사용하고 있습니다. 이 스크립트는 웹 루트 httpdocs 안에 있습니다. 아약스 호출이 문제없이 작동하고,하지만 난 내 PHP 로그에 다음과 같은 오류 메시지가 받고 있어요

<?php 

$filename = $_POST['fbpath']; 
$path = '/var/www/vhosts/mydomain.org.uk/private/uploadedfiles/' . $filename; 

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename='.basename($path)); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate'); 
header('Pragma: public'); 
header('Content-Length: ' . filesize($path)); 
ob_clean(); 
flush(); 
readfile($path); 
exit; 

?> 

:

PHP Warning: readfile(/var/www/vhosts/mydomain.org.uk/private/uploadedfiles/filename.docx): failed to open stream: No such file or directory 

내가 확인 한을 두 번 점검하고 다음과 같이 스크립트입니다 트리플 체크하고 파일이 uploadedfiles 폴더 안에 확실히 존재합니다.

나는 또한 open_basedir 제한 문제가 아니라는 것을 확인했습니다. 나는 그렇지 않다고 확신합니다.

내가 누락 된 것이 정말 간단하다는 것이 확실합니다 - 어디에서 잘못 될까요?

추가로, 아직 파일을 업로드하기위한 스크립트를 작성하지 않았습니다. 사전에 알아야 할 사항이 있습니까?

감사합니다.

+0

확인 폴더'uploadedfiles'와 그 내용의 권리는 ... 그것은 웹 서버가 될 수 또는 PHP 때문에 그들에 설정된 권한의 파일에 액세스 할 수 있습니다 ... – RichardBernards

+0

나는 연 모든 권한을 (내 FTP 클라이언트를 통해) 올린다 - 권한 행은 현재'private'과'uploadedfiles' 폴더에'drwxrwxrwx'를, 내부에 저장된 파일에 대해서는'-rwxrwxrwx'를 읽는다. 이게 당신이 의미 한거야? 그렇다면 제대로 작동하지 않는 것 같습니다. 네가 뭔가 다른 것을 의미한다면 나에게 알려줄 수 있니? 감사! – Chris

답변

0

많은 시행 착오 끝에 문제가 해결 된 것으로 보입니다.

문제는 jQuery/Ajax를 사용하는 데있었습니다.

downloadscript.php 파일이 페이지의 링크에서 직접 $_GET 요청으로 액세스되는 방식을 변경하면 치료가 효과적입니다.

어쨌든 모두 도와 주셔서 감사합니다.

크리스

0

이 문제는 한 번 발생했습니다. 그것은 정말로 해결책이 아니라 당신을위한 해결 방법입니다. 내가 한 일은 웹 루트 안의 tmp 폴더에 파일을 다운로드하는 것입니다. 그런 다음 cron 작업 (Plesk의 예약 작업)이 서버에서 실행되고 linux copy 명령을 사용하여 임시 폴더의 모든 파일을 웹 루트 외부의 다른 폴더로 복사합니다.

그러나, 당신은 당신이 원하는 여기 좀 걸릴 수 있습니다 :

희망이 당신을 도울 수 있습니다.