2010-10-27 6 views
5

Aggiornamento:Come passare i dati POST al PHP-CGI?

In un impeto di disperazione, ho fatto quanto segue in una 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 

... e ancora nessuna $_POST variabili vengono visualizzati in uscita di questo:

<?php var_dump($_POST); ?> 

sto cercando di creare un piccolo webserver che si interfaccia con il php-cgi binario. Tuttavia, le cose non stanno andando così bene. Il binario php-cgi gestisce correttamente le richieste GET. Quando si tratta di richieste POST, l'array $_POST è vuoto, anche quando le cose vengono sottoposte a POST.

Ho controllato le intestazioni HTTP inserite nel binario php-cgi e comprendono effettivamente i dati POST e l'intestazione Content-type: application/x-www-form-urlencoded.

Che cosa potrebbe impedire al binario php-cgi di vedere che nella richiesta sono inclusi i dati POST?


sto facendo progressi, ho scavato un po 'di roba da PHP source code:

  • /sapi/cgi/cgi_main.c:

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

(. Ho idea dove questa funzione viene richiamata da)


Dopo aver letto la risposta qui sotto, ho provato:

<?php 

var_dump($HTTP_RAW_POST_DATA); 

?> 

... che ha prodotto l'uscita:

NULL 

... indicando che qualcosa di ancora più strano è al lavoro qui.


Mi sto avvicinando ... Ho trovato questa funzione in /main/php_content_types.c:

SAPI_API SAPI_POST_READER_FUNC (php_default_post_reader)

... e sembra essere il codice che elabora le richieste POST.

+0

È ora di scegliere la sorgente PHP: P –

+1

Non ho una risposta, ma i dati POST dovrebbero essere inviati tramite stdin. –

+0

Il server Web implementa correttamente la specifica CGI 1.1? – joschi

risposta

4

ho finalmente figurato fuori:

A quanto pare la variabile d'ambiente CONTENT_LENGTH deve essere stabilito.

Aggiunta:

CONTENT_LENGTH=6 
export CONTENT_LENGTH 

al mio esempio di cui sopra induce a funzionare correttamente!

+0

Probabilmente dovresti anche impostare Content-type al minimo - in pratica tutte le cose HTTP che stavi cercando di pipe in stdin nella versione precedente dello script della shell deve essere impostato come variabile di ambiente prima dell'avvio del CGI. Oh, e dovresti contrassegnare questa risposta come "accettata" :) – TML

+0

@TML: True - Ho aggiunto "Content-type" ora che funziona. Non posso accettarlo fino a 24 ore dopo averlo postato. (IIRC) –

0

Prova a verificare la variabile $ HTTP_RAW_POST_DATA.

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

+0

Arriva come 'NULL'. Perché lo sta facendo? –

+0

Poiché $ HTTP_RAW_POST_DATA è una soluzione terribile - file_get_contents ('php: // input') è migliore, ma non funzionerà con dati codificati multipart/form-data. – TML

+0

Per saperne di più sulle differenze su http://us3.php.net/manual/en/wrappers.php.php – TML

2

Hai detto che il tuo sistema ha funzionato correttamente. la lunghezza del contenuto deve essere impostata solo per i POST

Anche questo potrebbe aiutare, è la specifica CGI/1.1. Esso mostra ciò che le variabili di ambiente devono essere impostati:

http://graphcomp.com/info/specs/cgi11.html e questo lib.ru/WEBMASTER/cgi1_1spec/interface.html

Quali sono state le variabili d'ambiente minimi avete avuto bisogno di ottenere richieste GET di lavoro?

+0

SCRIPT_FILENAME, REQUEST_METHOD e REDIRECT_STATUS. –

+0

REDIRECT_STATUS non è richiesto se hai cgi.force_redirect = 0 nel tuo php.ini. Ho provato ad aggiungerlo e SCRIPT_FILENAME e ancora non funzionerà –