2010-05-29 3 views
30

아주 간단해야합니다. 나는 내가 찾을 수있는 모든 튜토리얼과 포럼을 따라 갔지만 아직 작동시키지 못한다. 아파치 2에서 PHP로 RESTful API를 만들고 싶다. 내 가상 호스트 지시어에서 Apache2 및 PHP에서 HTTP PUT 및 DELETE를 활성화하고 사용하는 방법은 무엇입니까?

내가 말 :
<Directory /> 
    AllowOverride All 
    <Limit GET HEAD POST PUT DELETE OPTIONS> 
     Order Allow,Deny 
     Allow from all 
    </Limit> 
</Directory> 

아직 내가 서버에서는 모든 PUT 요청, 나는 405 방법은 지원되지 얻을.

누군가는 Script 지시문을 사용하는 것을 권유했지만, CGI와는 달리 mod_php를 사용했기 때문에 왜 작동하는지 알 수 없습니다.

사람들은 WebDAV를 사용하여 언급하지만 지나치게 과장된 것처럼 보입니다. 결국 DAV 잠금, DAV 파일 시스템 등은 필요하지 않습니다. 원하는 것은 PHP 스크립트로 요청을 전달하고 모든 것을 직접 처리하는 것입니다. 나는 단지 깨끗한 의미에 대해 PUT과 DELETE를 가능하게하고 싶다.

답변

17

아무 것도 구성 할 필요가 없습니다. 요청이 PHP 파일에 매핑되고 경로 정보와 함께 요청을 사용해야합니다. 다음 HTTP 요청이 일하는 것이

<?php 

var_dump($_SERVER['REQUEST_METHOD']); 
var_dump($_SERVER['REQUEST_URI']); 
var_dump($_SERVER['PATH_INFO']); 

if (($stream = fopen('php://input', "r")) !== FALSE) 
    var_dump(stream_get_contents($stream)); 

:

Established connection with 127.0.0.1 on port 81 
PUT /handler.php/bla/foo HTTP/1.1 
Host: localhost:81 
Content-length: 5 
  
boo 
HTTP/1.1 200 OK 
Date: Sat, 29 May 2010 16:00:20 GMT 
Server: Apache/2.2.13 (Win32) PHP/5.3.0 
X-Powered-By: PHP/5.3.0 
Content-Length: 89 
Content-Type: text/html 
  
string(3) "PUT" 
string(20) "/handler.php/bla/foo" 
string(8) "/bla/foo" 
string(5) "boo 
" 
Connection closed remotely. 

당신은 MultiViews 또는 당신과 함께 "PHP는"확장자를 숨길 수 루트에있는 경우 예를 들어, 파일이 콘텐츠와 handler.php 이름 URL을 mod_rewrite과 완전히 논리적으로 만들 수 있습니다.

AcceptPathInfo 지시어에 대한 설명서와 make PHP not parse POST data when enctype is multipart/form-data에 대한이 질문도 참조하십시오.

+0

우수, 많은 감사! –

+0

cURL 명령 줄 사용 : "curl -X PUT --header"콘텐츠 유형 : application/octet-stream "--data-binary"@ 1.gif "-v /handler.php/bla/foo"및 PHP 내부 파일을 파일로 덤프하십시오. 그것은 위대한 작품. 그러나 예를 들어 몇 가지 추가 정보를 보내야합니다. 파일 업로드 요청이있는 토큰 POST를 사용해야한다고 생각합니다. –

+0

토큰은 헤더에도있을 수 있습니다.) –

-6

PUT 및 DELETE 요청을 사용하는 기술적 한계는 PHP 또는 Apache2와 관련이 없습니다. 이러한 유형의 요청을 전송하는 것은 브라우저의 부담입니다.

단순히 < 형태의 액션 = "방법은 (그리고 그들은 단순히 GET하는 기본 것이라는 점을 지원하는 어떤 브라우저가 없기 때문에이 FDSFGS처럼 횡설수설을 치료하는 것처럼"방법 = "같은 PUT 치료, 작동하지 않습니다">을 넣어 두는). 안타깝게도 이러한 HTTP 동사는 데스크톱이 아닌 응용 프로그램 브라우저 (즉, 웹 서비스 소비자)의 영역으로 제한됩니다.

+11

그는 편안한 API를 원한다고 말했기 때문에 브라우저를 사용하지 않아도됩니다. 어쨌든 현재 브라우저는 XmlHttpRequest를 통해 PUT, DELETE 등을 지원합니다 – Artefacto

-3

Linux의 경우 /etc/apache2/mods-enabled/php5.conf dans php5.load이 존재합니다. 그렇지 않은 경우이 모듈을 활성화합니다 (sudo apt-get install libapache2-mod-php5 필요).

+0

코드 태그를 사용 할 수 있습니까? 그러면 훨씬 더 쉽게 읽을 수 있습니다. – Styxxy

-3

서버에서 삭제할 파일 이름을 게시하여 서버에서 쉽게 삭제할 수 있습니다. 파일을 쉽게 unlink() 할 수 있습니다.

+0

명시된 문제는 파일을 PUT하지 못했습니다. 서버에 대한 POST 데이터가 PUT 메소드로 실패를 수정한다고 생각하는 이유를 명확히하십시오. 하나의 HTTP 요청에서 두 가지 다른 메소드 (POST 및 PUT)를 사용할 수 없으므로 응답으로 문제를 해결할 수있는 방법을 알 수 없습니다. – AnotherSmellyGeek

0

는에 AllowOverride authconfig를

이 시도. 인증이 문제 일 수 있습니다. 나는 C++로 작성된 CGI 스크립트로 작업하고 DELETE를 통과 할 때 몇 가지 인증 문제에 직면했다. 위의 해결책은 나를 도왔습니다. 그것은 당신의 경우에도 도움이 될 수 있습니다. 당신이 "CORS"를 사용하지 않고 작업을 중지하지 않는 PUT의 문제에 대한 해결책을 얻을 삭제하지 않은 경우에도 또한


. 문제를 우회하는 데 도움이되는 Google 크롬 앱이지만 일시적인 해결책이므로 직장이나 실험이 오랫동안 동결되지 않습니다.시스템 보안을 손상시킬 수 있으므로 솔루션을 실행하기 위해 "CORS"를 활성화하도록 고객에게 요청할 수는 없습니다.

+0

명시된 문제가 403이 아니라 405라는 사실에도 불구하고 인증이 근본 원인이라고 생각하는 이유는 무엇입니까? CORS는 HTTP 방법 수용성 또는 인증과 관련이 있습니까? 답을 명확히하여이 세 가지 개념 중 어떤 것을 말하고 있는지 명확히 말씀해주십시오. – AnotherSmellyGeek

관련 문제