2017-05-04 74 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

相關問題