开发者

How to pass POST data to the PHP-CGI?

开发者 https://www.devze.com 2023-01-21 08:43 出处:网络
Update: In开发者_运维技巧 a fit of desperation, I did the following in a shell: REDIRECT_STATUS=true

Update:

In开发者_运维技巧 a fit of desperation, I did the following in a shell:

REDIRECT_STATUS=true
SCRIPT_FILENAME=/var/www/...
REQUEST_METHOD=POST
GATEWAY_INTERFACE=CGI/1.1
export REDIRECT_STATUS
export SCRIPT_FILENAME
export REQUEST_METHOD
export GATEWAY_INTERFACE
echo "test=1" | php-cgi

...and STILL no $_POST variables are showing up in the output of this:

<?php var_dump($_POST); ?>

I am trying to create a small webserver that interfaces with the php-cgi binary. However, things aren't going so well. The php-cgi binary correctly handles GET requests. When it comes to POST requests, the $_POST array is empty, even when things are getting POSTed.

I've checked the HTTP headers being fed into the php-cgi binary and they do indeed include the POST data and the Content-type: application/x-www-form-urlencoded header.

What could be keeping the php-cgi binary from seeing that there's POST data included in the request?


I'm making progress, I've dug up some stuff from the PHP source code:

  • /sapi/cgi/cgi_main.c:

    468: static int sapi_cgi_read_post(char *buffer, uint count_bytes TSRMLS_DC)

(I have no idea where this function is invoked from.)


After reading the answer below, I tried:

<?php

var_dump($HTTP_RAW_POST_DATA);

?>

...which yielded the output:

NULL

...indicating that something even stranger is at work here.


I'm getting closer... I found this function in /main/php_content_types.c:

SAPI_API SAPI_POST_READER_FUNC(php_default_post_reader)

...and it seems to be the code that processes POST requests.


I finally figured it out:

Apparently the CONTENT_LENGTH environment variable needs to be set.

Adding:

CONTENT_LENGTH=6
export CONTENT_LENGTH

to my example above causes it to work properly!


You mentioned that your system did GETs just fine. content length only needs to be set for POSTs

Also this might help, it's the CGI/1.1 specification. It shows what environment variables need to be set:

http://graphcomp.com/info/specs/cgi11.html and this lib.ru/WEBMASTER/cgi1_1spec/interface.html

What were the minimum environment variables you needed to get GET requests working?


Try checking the $HTTP_RAW_POST_DATA variable.

http://php.net/manual/en/reserved.variables.httprawpostdata.php

0

精彩评论

暂无评论...
验证码 换一张
取 消