2017-05-04 45 views
2

我正在将大约十几个移动应用程序API从Apache转移到Nginx,而且我很难让API正常工作。我努力让auth头文件通过了几天(see here),但我终于设法实现了这个目标。现在,当我尝试请求内容类型为application/json时,$_REQUEST为空。奇怪的是,如果我将内容类型更改为application/x-www-form-urlencoded,$_REQUEST按预期方式存在。Nginx,fastcgi当请求内容类型为应用程序/ json时,PHP请求体为空

现在,我知道简单的答案是将手机应用程序更改为使用该内容类型,但由于我们拥有的应用程序数量太多,所以这是不可行的。更何况,不保证用户将更新他们的应用程序等。

任何想法,我可以解决这个问题?这里是我的Nginx的conf文件:

这里是我的主nginx.conf HTTP块:

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

这里是我的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; 
    } 
} 

最后,这里是我的fastcgi_params文件:

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

有没有什么奇怪的 - PHP根本不会填充$ _POST/$ _ REQUEST,数据以JSON形式发送。你需要从'php:// input'读取它。 – CBroe

+0

@CBroe你。是。真棒。你已经帮了我很大的忙,我真的很感激。想要做出答案,以便我可以标记它? – dericcain

回答

1

PHP只是不会填充$ _POST/$ _ REQUEST并将数据发送为JSON。

你需要从php://input自己读它,例如使用file_get_contents(最快的方式恕我直言)

之后,你得到字符串形式的原始主体内容,这样就可以在其上使用json_decode