2010-05-08 4 views
2

서버에서 HTTP PUT 요청을 수신했으며이 요청을 다른 서버로 리디렉션/전달하고 싶습니다.PHP로 HTTP PUT 요청을 전달/리디렉션하는 방법은 무엇입니까?

PHP로 서버에서 PUT 요청을 처리합니다.

PUT 요청이 기본 HTTP 인증을 사용 중입니다.

www.myserver.com/service/put/myfile.xml 

리디렉션

www.myotherserver.com/service/put/myfile.xml 

에 내 첫 번째 서버에 파일을 저장하고 CURL을 사용하여 PUT 요청을 재전송하지 않고이 작업을 수행 할 수있는 방법 : 여기

은 예입니다?

감사합니다.

답변

5

HTTP/1.1은 이러한 리디렉션에 대한 상태 코드 307을 정의합니다. 그러나 PUT은 일반적으로 클라이언트 소프트웨어에서 사용되며 거의 아무런 상을 수여 할 수는 없습니다. 307.

이렇게하는 가장 효율적인 방법은 요청을 새 URL로 리디렉션하도록 Apache에서 프록시를 설정하는 것입니다.

이 어떻게 당신이 프록시 그것은 PHP에서 할 수있는,

$data = file_get_contents('php://input'); 
$mem = fopen('php://memory'); 
fwrite($mem, $data); 
rewind($mem); 
$ch = curl_init($new_url);        
curl_setopt($ch, CURLOPT_PUT, true); 
curl_setopt($ch, CURLOPT_INFILE, $mem); 
curl_setopt($ch, CURLOPT_INFILESIZE, strlen($data)); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
curl_exec($ch);  
curl_close($ch); 
fclose($meme); 
+0

32MB를 초과하는 파일의 경우 메모리가 오버 플로우되지 않습니까? +1에 대한 스 니펫. 'php : // input'에 대해 생각하지 않았습니다. – BalusC

+0

PHP 변수에서 전체 파일을로드하지 않고이 작업을 수행 할 수있는 방법이 있습니까? – benjisail

+0

알 수 없습니다. 문제는 CURL이 PUT 본문을 스트리밍하는 방법이 없다는 것입니다. 전체 입력을 읽지 않으면 INFILESIZE를 알 수 없습니다. 메모리 사용량이 문제가되면 "php : // memory"를 "php : // temp"로 변경할 수 있습니다. –

2

불가능합니다. 리디렉션은 암시 적으로 GET 요청입니다. curl을 사용하여 프록시 용으로 게임해야합니다.

디스크에 저장하는 것도 기술적으로 반드시 필요한 것은 아닙니다. 응답 바디를 Curl의 요청 본문에 직접 파이프 할 수 있습니다. 그러나 나는 PHP에서 이것을 한 번도 해 본 적이 없기 때문에 (자바에서는 케이크 조각이다), 그것에 대해 더 자세한 답변을 드릴 수는 없다.

+0

감사합니다! 누군가가 PHP로 응답 본문을 파이프하는 방법을 알고 있습니까? – benjisail

+0

요점 : 로컬 파일 대신 컬링 파일에 직접 작성해야합니다. 그것은 이미 로컬 디스크 파일 시스템에 쓰기 위해 불필요한 단계를 생략 할 것입니다. 하지만 PHP는 암시 적으로 전체 파일을 메모리 나 다른 임시 저장소에 먼저 저장합니다. 구성 가능할지 모르지만 잘 모르겠습니다. – BalusC

관련 문제