2017-05-04 1 views
2

Je déplace une douzaine d'API d'applications mobiles d'Apache vers Nginx et j'ai du mal à faire fonctionner correctement l'API. J'ai eu du mal à faire passer les en-têtes auth pendant quelques jours (see here) mais j'ai finalement réussi à faire fonctionner ça. Maintenant, lorsque je tente de faire une demande avec le type de contenu application/json, $_REQUEST est vide. Assez curieusement, si je change le type de contenu à application/x-www-form-urlencoded, le $_REQUEST est présent comme prévu. Maintenant, je sais que la réponse simple serait de changer les applications mobiles pour utiliser ce type de contenu, mais ce n'est pas faisable en raison de la quantité d'applications que nous avons. Sans oublier, il n'y a pas de garantie que les utilisateurs vont mettre à jour leur application, etc.Nginx, fastcgi Le corps de la requête PHP est vide quand l'application de type content/json

Des idées comment je peux résoudre ce problème? Voici mes Nginx fichiers de configuration:

Voici mon principal bloc http nginx.conf:

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; 
} 

Et voici mon valet.conf:

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; 
    } 
} 

Et enfin, voici mes fastcgi_params fichier:

fastcgi_param QUERY_STRING $query_string; 
fastcgi_param REQUEST_METHOD $request_method; 
fastcgi_param CONTENT_TYPE $content_type; 
fastcgi_param CONTENT_LENGTH $content_length; 
fastcgi_param SCRIPT_FILENAME $request_filename; 
fastcgi_param SCRIPT_NAME $fastcgi_script_name; 
fastcgi_param REQUEST_URI $request_uri; 
fastcgi_param DOCUMENT_URI $document_uri; 
fastcgi_param DOCUMENT_ROOT $document_root; 
fastcgi_param SERVER_PROTOCOL $server_protocol; 
fastcgi_param GATEWAY_INTERFACE CGI/1.1; 
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; 
fastcgi_param REMOTE_ADDR $remote_addr; 
fastcgi_param REMOTE_PORT $remote_port; 
fastcgi_param SERVER_ADDR $server_addr; 
fastcgi_param SERVER_PORT $server_port; 
fastcgi_param SERVER_NAME $server_name; 
fastcgi_param HTTPS $https if_not_empty; 
fastcgi_param REDIRECT_STATUS 200; 
fastcgi_param HTTP_PROXY ""; 
fastcgi_param HTTP_AUTHORIZATION $http_authorization; 
fastcgi_param OAUTH_TOKEN $http_oauth_token; 
fastcgi_param OAUTH_TOKEN_SECRET $http_oauth_token_secret; 
+0

Il n'y a rien de surprenant à cela - PHP ne remplit pas $ _POST/$ _ REQUEST avec des données envoyées en JSON. Vous devez le lire à partir de 'php: // input' – CBroe

+0

@CBroe You. Sont. Impressionnant. Vous m'avez aidé d'une telle manière et je l'apprécie vraiment. Voulez-vous en faire la réponse pour que je puisse la marquer? – dericcain

Répondre

1

PHP ne remplit pas simplement $ _POST/$ _ REQUEST avec des données envoyées au format JSON.

Vous devez lire de php://input vous, par exemple en utilisant file_get_contents (à mon humble avis moyen le plus rapide.)

Après cela, vous avez le contenu du corps brut sous forme de chaîne, de sorte que vous pouvez utiliser json_decode dessus.