2013-03-12 6 views
0

저는 작업중인 PHP REST API에 nginx를 사용하고 있습니다. REST-ful을 완전히 사용하려면 PUT/DELETE 요청을 적절하게 사용하고 있습니다. 그러나 PHP는 PUT 요청의 게시물 본문을 구문 분석하지 않습니다.Nginx PUT에서 POST로 요청 변경

필자가 직접 파싱을 고려했지만, PHP에서 C와 함께 할 수있게하려는 것이 었습니다. PHP에서 구현할 수있는 구현보다 훨씬 빠르기 때문에 b) 사람들이 이미 많은 시간을 들여서 일 해왔다. 나는 그 노력을 반복하지 않을 것이다.

API 쪽에서 이미 X-HTTP-Method-Override 헤더를 읽고 실제 동사에서 사용할 수있는 경우 지원하도록 추가했습니다.

지금 제가 찾고있는 것은 PUT 요청을 받아서 해당 헤더 세트가 포함 된 POST 요청으로 변경하는 방법입니다.

나는 여기 저기 다 보았지만 해결책을 찾을 수 없다고 느낀다. 아무 것도 도움이 될 것입니다. (다른 구문 분석 기법을 추천해도이 문제를 처리 할 필요가 없습니다.)

답변

1

Nginx는 REQUEST_METHOD 매개 변수를 통해 요청 방법의 FastCGI에만 알립니다. 따라서 단순히 값을 무시하고 PHP에 원하는 것을보고 할 수 있습니다.

map $request_method $fcgi_method { 
    default $request_method; 
    PUT POST; 
} 

이 (map 섹션 server와 같은 구성 수준 즉, http 레벨에 있어야합니다 참고 : 당신의 원래 요청 방법에 따라 $fcgi_method을, 그 이름을 보자, 당신의 Nginx의 구성에 또 다른 변수를 선언해야합니다 블록)

는 그런 다음과 같이 사용자의 위치에서 사용할 수 있습니다

fastcgi_param REQUEST_METHOD $fcgi_method; 

것이 중요합니다이 조각은 전형적인 include fastcgi_params 후입니다 또는 비슷하게.

+0

와우 - 당신은 전적으로 옳습니다. 이것이 제가 아파치의 세계에서 오는 것입니다. –

+0

작동하지 않습니다. nginx : [emerg] "fastcgi_param"지시어는/etc/nginx/sites-enabled/xxxxx에 허용되지 않습니다. x – Philio

+0

@Philio 아, 네 말이 맞아. 나는 대답을 수정했습니다 –

0

다른 누구나 PHP (또는 일부 글로벌 $ _WHATEVER 배열에 채워지지 않은 다른 요청 방법)를 사용하여 PUT 요청을 처리하는 방법을 고려하면이 방법이 올바른 방법이라고 생각하면 가치가 있다고 생각합니다. put 요청의 본문을 가져 오는 것은 php://input의 내용을 읽는 것입니다. 이 같은

뭔가 작업을해야합니다 :

$data = file_get_contents("php://input");