繁体   English   中英

$ _POST在Nginx上为空

[英]$_POST is empty on nginx

我的问题似乎与$ _POST为空类似 Nginx OSx$ _POST在nginx中为空$ _GET填充,但$ _REQUEST为空 ,但是我在那里找不到解决方案。

长话短说,我无法将POST请求发送到服务器上名为server.php的文件。

假设我的server.php仅包含以下内容:

<?php var_dump($_REQUEST);

并且我的sites-available/domain.tld文件包含以下内容:

server {

    root /var/www/domain.tld/current/dist;
    index index.html index.htm;

    server_name domain.tld;


    location / {
        try_files $uri $uri/ index.php?$query_string =404;
    }

    location ~ \.php$ {
            #limit_except POST {
            #    allow 127.0.0.1;
            #    deny  all;
            #}

            #if ( $request_method !~ ^POST$ ) {
            #    return 405;
            #}

            include snippets/fastcgi-php.conf;

            fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
            #fastcgi_param REQUEST_METHOD $request_method;
            fastcgi_param  REQUEST_METHOD     $echo_request_method;
            fastcgi_param CONTENT_TYPE $content_type;
            fastcgi_param CONTENT_LENGTH $content_length;
            fastcgi_param REQUEST_BODY $request_body;
            fastcgi_param QUERY_STRING $query_string;

    }

    location ~ /\.ht {
            deny all;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    server_name www.domain.tld;
    return 301 $scheme://domain.tld$request_uri;
}

server {
    if ($host = domain.tld) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


        listen 80;

        server_name domain.tld;
    return 404; # managed by Certbot

}

无论我在server.php上发出什么“ POST”请求,都不会通过它发送任何参数。

server.php输出将是array(0) {}

其他一些信息:

  • 在请求URL上进行请求: https://domain.tld/server.php

  • 请求方法: POST

  • 状态码: 200 OK

https://domain.tld/server.php?foo=bar这样发送的GET请求将显示正确的foo变量,其值为bar

如果需要,我可以提供有关请求本身的详细信息。 (在vue应用中使用axios )。

请指教...

这个答案可能有点晚了,但是为了其他任何人遇到同样的问题:

结果是Content-Type标头的值为application/json 当PHP将数据解析为$_POST超全局变量时,它期望此标头具有值application/x-www-form-urlencodedmultipart/form-data ,这是网络标准内容类型。 接收application/json内容类型数据时,必须从php://input流访问它。

一个解决方案将最终看起来像这样:

$json_string_data = file_get_contents('php://input');
$decoded_data = json_decode($json_string_data, true);

如果您的应用程序希望数据在$_POST超全局$_POST可用,则可以使用以下(公认的hacky)解决方案:

$json_string_data = file_get_contents('php://input');
$decoded_data = json_decode($json_string_data, true);
$_POST = $decoded_data;

或者,为简便起见:

$_POST = json_decode(file_get_contents('php://input'), true);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM