HTTP Request Body einlesen
RFZ
- php
Nabend,
ich möchte den Body des HTTP Requests an mein Script direkt auslesen (keine urlencodete Formulardaten, kein Dateiupload).
Ich hab dazu schonmal was gelesen und meinte mich erinnern zu können dass man das via lesen von "php://stdin" oder "php://input" machen kann, das hat mich aber leider nicht zum Erfolg geführt, wenn ich davon lese bekomme ich nur Leerstrings - einzige Ausnahme, wenn der Content-Type "application/x-www-form-urlencoded" ist, dann kann ich von "php://input" lesen, aber ich möchte es allgemein halten.
Auch $HTTP_RAW_POST_DATA ist leer, wobei mir das eh schon zu speziell ist, es muss sich nichtmal zwangsweise um ein POST Request handeln.
Leider hab ich nichts weiteres dazu gefunden.
Gibt es da eine Möglichkeit?
Ich hab PHP als Modul laufen, wenn das wichtig ist, am liebsten wär mir aber natürlich eine Möglichkeit die auch als CGI funktioniert.
Gruß,
Andreas
Hello,
Auch $HTTP_RAW_POST_DATA ist leer,
Das musst Du auch erst einschalten in der Konfiguration
always_populate_raw_post_data
Ein harzliches Glückauf
Tom vom Berg
Das musst Du auch erst einschalten in der Konfiguration
always_populate_raw_post_data
Danke, das hab ich tatsächlich übersehn...
Aber, auch dann geht es nur mit "application/x-www-form-urlencoded".
Ausserdem wär mir eine Lösung lieber, bei der ich nicht an die Serverkonfiguration muss, auch wenn ich in diesem konkreten Fall das Recht dazu habe.
Gruß,
Andreas
Hello,
und über fopen('php://input','r') ?
Ein harzliches Glückauf
Tom vom Berg
Hello,
und über fopen('php://input','r') ?
http://de2.php.net/manual/en/wrappers.php.php
Ein harzliches Glückauf
Tom vom Berg
und über fopen('php://input','r') ?
Das ist mir ja wie ursprünglich gesagt schon bekannt, aber "php://input" geht nicht mit "multipart/form-data" und "php://stdin" geht bei mir garnicht (ich schätz mal, das könnt bei CGI funktionieren).
Ich schreibe für eine Demonstration einen kleinen transparenten HTTP Proxy mit PHP und muss dazu den Request Body 1:1 weiterreicht, daher sollte es unabhängig vom Content-Type funktionieren.
Natürlich könnte ich abhängig vom Content-Type versuchen mit $_POST, $_FILES und php://input den Body zu rekonstruieren, aber das wäre nicht allgemeingültig und vor allem ein größerer Aufwand :(
Gruß,
Andreas
Hello,
was sagt denn der Webserver?
Der muss die Raw-Data doch haben.
Hast Du mal geschaut, ob Du sie zusätzlich zu den $_SERVER-Daten importieren kannst?
Das geht mit der Rewrite-Engine.
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html
Die Environment-Variable THE_REQUEST könnte Dein Freund werden.
Wenn Du allerdings keinen Apachen hast, weiß ich nicht, ob es auch geht.
Ein harzliches Glückauf
Tom vom Berg
Hello,
Die Environment-Variable THE_REQUEST könnte Dein Freund werden.
Entschuldige, das war die falsche.
Aber es gibt eine!
Ein harzliches Glückauf
Tom vom Berg
Hello,
ausprobieren könntest Du es ja trotzdem mal, was dabei herauskommt, wenn Du in die .htaccess folgendes Einträgst:
RewriteEngine on
RewriteRule .* - [E=THE_REQUEST:%{HTTP:Fullrequest},L]
Die Variable müsste in S_SERVER landen.
Ein harzliches Glückauf
Tom vom Berg
RewriteEngine on
RewriteRule .* - [E=THE_REQUEST:%{HTTP:Fullrequest},L]Die Variable müsste in S_SERVER landen.
Guter Ansatz, aber klappt leider auch nicht. $_SERVER['REDIRECT_THE_REQUEST'] existiert zwar, ist aber immer leer... wo hast du denn %{HTTP:Fullrequest} her? Laut Manual würde das doch nur den Header "Fullrequest" ausgeben.
Gruß,
Andreas
Hello,
RewriteEngine on
RewriteRule .* - [E=THE_REQUEST:%{HTTP:Fullrequest},L]Die Variable müsste in S_SERVER landen.
Guter Ansatz, aber klappt leider auch nicht. $_SERVER['REDIRECT_THE_REQUEST'] existiert zwar, ist aber immer leer... wo hast du denn %{HTTP:Fullrequest} her? Laut Manual würde das doch nur den Header "Fullrequest" ausgeben.
Stimmt leider alles nicht.
Ich nehme anm dass ich das aus einer nicht standardisierten Einrichtung hatte.
Wenn Du
RewriteRule .* - [E=THE_REQUEST:%{THE_REQUEST},L]
nimmst, bekommst Du leider nur die vollständige Zeile mit Requestmethode, HTTP-Version und Request-String
Ein harzliches Glückauf
Tom vom Berg
Entschuldige, das war die falsche.
Aber es gibt eine!
Würdest du sie mir verraten? Ich kann keine finden.
Ich wüßt aber auch nicht wie ich das dann machen soll...
mod_rewrite nutze ich ja, um alle Requests an den Server an mein Proxy-Skript zu leiten. Wenn ich jetzt sowas wie "RewriteRule .* proxy.php?data=%{HTTP_DATA}" schreibe, glaub ich kaum dass ich via $_GET['data'] an die Daten komme, da bin ich etwas skeptisch... Und über $_SERVER['REQUEST_URI'] bekomme ich ja die ursprüngliche URL, die ich auch brauche, für die Anfrage an der echten Webseite.
Gruß,
Andreas