2017-05-04 1 views
2

Ich bin über ein Dutzend Mobile App APIs von Apache zu Nginx und ich habe eine harte Zeit bekommen die APIs richtig funktionieren. Ich hatte Probleme, die Auth-Header für ein paar Tage durchzulassen (see here), aber ich schaffte es endlich, dass das funktionierte. Wenn ich nun versuche, eine Anfrage mit dem Inhaltstyp application/json zu stellen, ist $_REQUEST leer. Seltsamerweise, wenn ich den Inhaltstyp auf application/x-www-form-urlencoded ändere, ist der $_REQUEST wie erwartet vorhanden.Nginx, fastcgi PHP Anfrage Körper leer, wenn Content-Type-Anwendung/JSON

Jetzt weiß ich, die einfache Antwort wäre, die mobilen Apps zu ändern, um diesen Inhaltstyp zu verwenden, aber das ist wegen der Menge der Anwendungen, die wir haben, nicht machbar. Nicht zu vergessen, es gibt keine Garantie, dass die Benutzer ihre App usw. aktualisieren werden.

Irgendwelche Ideen, wie ich das lösen kann? Hier ist meine Nginx conf Dateien:

Hier ist mein Haupt nginx.conf http Block:

http { 
    include mime.types; 
    default_type application/octet-stream; 

    sendfile on; 
    keepalive_timeout 6000; 
    client_max_body_size 128M; 

    gzip on; 
    gzip_comp_level 5; 
    gzip_min_length 256; 
    gzip_proxied any; 
    gzip_vary on; 

    gzip_types 
    application/atom+xml 
    application/javascript 
    application/json 
    application/rss+xml 
    application/vnd.ms-fontobject 
    application/x-font-ttf 
    application/x-web-app-manifest+json 
    application/xhtml+xml 
    application/xml 
    font/opentype 
    image/svg+xml 
    image/x-icon 
    text/css 
    text/plain 
    text/x-component; 

    include /Users/webdev2/.valet/Nginx/*; 
    include servers/*; 
    include valet/valet.conf; 
} 

Und hier meine valet.conf ist:

server { 
    listen 80 default_server; 
    root /; 
    charset utf-8; 

    location /41c270e4-5535-4daa-b23e-c269744c2f45/ { 
     internal; 
     alias /; 
     try_files $uri $uri/; 
    } 

    location/{ 
     rewrite^/Users/webdev2/.composer/vendor/laravel/valet/server.php last; 
    } 

    location = /favicon.ico { access_log off; log_not_found off; } 
    location = /robots.txt { access_log off; log_not_found off; } 

    access_log off; 
    error_log /Users/webdev2/.valet/Log/nginx-error.log; 

    error_page 404 /Users/webdev2/.composer/vendor/laravel/valet/server.php; 

    location ~ \.php$ { 
     fastcgi_split_path_info ^(.+\.php)(/.+)$; 
     fastcgi_pass unix:/Users/webdev2/.valet/valet.sock; 
    fastcgi_pass_request_headers on; 
    fastcgi_pass_header Authorization; 
    fastcgi_pass_header http_oauth_token; 
    fastcgi_pass_header oauth_token_secret; 
     fastcgi_index /Users/webdev2/.composer/vendor/laravel/valet/server.php; 
     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME /Users/webdev2/.composer/vendor/laravel/valet/server.php; 
     fastcgi_read_timeout 300; 
    } 

    location ~ /\.ht { 
     deny all; 
    } 
} 

Und schließlich ist hier mein fastcgi_params Datei:

+0

Es gibt nichts Überraschendes daran - PHP füllt einfach $ _POST/$ _ REQUEST nicht mit Daten, die als JSON gesendet werden. Sie müssen es lesen von 'php: // input' – CBroe

+0

@CBroe Sie. Sind. Genial. Sie haben mir auf eine so große Weise geholfen und ich schätze es sehr. Willst du die Antwort machen, damit ich sie markieren kann? – dericcain

Antwort

1

PHP füllt einfach nicht $ _POST/$ _ REQUEST mit Daten senden als JSON.

Sie müssen es von php://input selbst zu lesen, zum Beispiel mit file_get_contents (schnellstem Weg IMHO.)

Danach, haben Sie den Rohkarosse Inhalt in String-Form, so dass Sie json_decode auf sie verwenden können.