Data z POST request body (reactjs appka) se po cestě do php ztratí

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jan Mikeš
Člen | 771
+
+1
-

Ahoj, děje se nám dost divná věc. Ve zkratce, mám velké podezření, že nginx zahazuje POSTy z react appky a nevím proč.

Postupuji následovně, v index.php (nette appka) si dám breakpoint a sleduju, co tam přijde za get a post parametry. Pokud pošlu cURL s postem, je to paráda, vše šlape. Pokud pošlu postman request, vše taky šlape. Pokud pošlu GET request z react appky, taky vše pohoda.
Problém nastává, když chceme posílat POST requesty, request vypadá v pořádku, ale v PHP je $_POST prázdné. Více asi napoví screenshoty.

POST cURL: curl -X POST -d 'email=test@odbav.to&password=test' "http://odbavto-new.dev/login"
Screen z postmana

Request z react appky vs stav v breakpointu kde ty posty jsou?

v react appce máme následující kód:

axios({
    method: 'POST',
    url: 'http://odbavto-new.dev/login',
    data: {'email': 'test@odbav.to', 'password': 'test'}
  })

V nginxu loguju $request_body a pro ten post request z reactu se objeví toto, takže tam nějaká data asi dotečou, ale ztratí se a do PHP nedorazí:

{\x22email\x22:\x22test@odbav.to\x22,\x22password\x22:\x22test\x22}

Řeším to už 2 dny a jsem z toho úplně na prášky, ani google už není nápomocen, budu velmi rád za jakékoliv nakopnutí.

Ještě pro jistotu, takto vypadá moje nginx konfigurace:

worker_processes  auto;

events {
    worker_connections  1024;
}

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

    access_log /dev/null;
    error_log /usr/local/var/log/nginx/error.log;

    log_format postdata $request_body;
    access_log  /usr/local/var/log/nginx/postdata.log  postdata;

    sendfile        on;
    keepalive_timeout  65;

    gzip  on;

    server {
        listen 80;
        listen 443 ssl http2;

        ssl_certificate ssl/nginx.crt;
        ssl_certificate_key ssl/nginx.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE, HEAD' always;
        add_header 'Access-Control-Allow-Headers' 'X-Requested-With,X-Authorization,Accept,Content-Type,Origin' always;

        server_name  _;
        server_tokens off;

        index  index.php index.html index.htm;

        set $basepath "/Users/janmikes/Sites";
        set $domain $host;

        if ($domain ~* "^([\w\d\-]*)\.dev$") {
            set $domain $1;
        }

        if ($domain ~* "^([\w\d\-]*)\.([\w\d\-]*)\.dev$") {
            set $domain $2;
        }

        set $rootpath "${domain}";

        if (-d $basepath/$domain/www) {
            set $rootpath "${domain}/www";
        }

       if (-d $basepath/$domain/public) {
            set $rootpath "${domain}/public";
        }

        root $basepath/$rootpath;

        location ~ /\.|^\. {
            deny all;
        }

        location ~ \.(neon|ini|log|yml)$ {
            deny all;
        }

        location ~* \.(png|gif|jpg|jpeg|css|js|swf|ico|txt|bmp|pdf|doc|docx|ppt|pptx|zip)$ {
            access_log off;
            log_not_found off;
            expires max;
        }

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


        location ~* [^/]\.php(/|$) {
            include        fastcgi.conf;

            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index $document_root/index.php;
            fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;

            fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
            fastcgi_param PATH_TRANSLATED $document_root/$fastcgi_path_info;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }

        location / {
            try_files  $uri $uri/ index.php$is_args$args;

            if ($request_method = 'OPTIONS') {
                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                add_header 'Access-Control-Allow-Headers' 'X-Requested-With,X-Authorization,Accept,Content-Type,Origin';
                add_header 'Access-Control-Max-Age' 1728000;
                add_header 'Content-Type' 'text/plain charset=UTF-8';
                add_header 'Content-Length' 0;

                return 204;
             }
        }
    }
}
Jan Mikeš
Člen | 771
+
+2
-

Na slacku se mi dostalo velice rychlé odpovědi od @mrtnzlml a nerad bych ochudil náhodné kolemjdoucí o řešení :-).

mrtnzlml [5:59 PM]
Protože do POST se automaticky necpe vše, ale jen formát formuláře, protože jinak PHP neví jak JSON zpracovat (na pole).
[5:59]
http://php.net/…les.post.php:
[6:00]
Tohle je lepší na pochopení: http://stackoverflow.com/…4856/3135248