【问题标题】:Can't get QUERY_STRING from proxy to application无法从代理获取 QUERY_STRING 到应用程序
【发布时间】:2016-11-03 01:09:29
【问题描述】:

当我将表单数据发布到我的服务器时,我的 fastcgi 应用程序能够从 nginx 读取每个参数,但 QUERY_STRING 除外。查看 CONTENT_LENGTH 给出了正确的字符串长度,并且我的浏览器显示正在发送的数据,所以我只能认为没有设置某些内容或者我在寻找错误的地方。

我的位置文件:

location /testpage/test {
    include fastcgi_params;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;

    fastcgi_pass   unix:/var/run/fcgi-sock.fcgi;
    fastcgi_param  SCRIPT_FILENAME  /www/test-app;
}

我的测试应用:

#include "/usr/local/include/fcgiapp.h"

int main()
{
    FCGX_Request request;

    FCGX_Init();
    FCGX_InitRequest(&request, 0, 0);
    while (FCGX_Accept_r(&request) == 0)
    {
        FCGX_FPrintF(request.out, "Content-type: text/html\r\n\r\n <h1>Hello World!</h1>");

        char* q=FCGX_GetParam("REQUEST_METHOD",request.envp);
        if(q) FCGX_FPrintF(request.out, "%s", q);   
        else FCGX_FPrintF(request.out, "nope");

        q=FCGX_GetParam("QUERY_STRING",request.envp);
        if(q) FCGX_FPrintF(request.out, "%s", q);
        else FCGX_FPrintF(request.out, "nope");
}

我知道我需要解析字符串,但我只想首先获取字符串,正如我所说,我可以打印出 REQUEST_METHOD 和其他几个参数,而不是 QUERY_STRING。

【问题讨论】:

    标签: c nginx fastcgi


    【解决方案1】:

    在普通的 POST 中,数据不在 QUERY_STRING 中,而是通过标准输入传递给 CGI 进程。看FCGX_Request.in

    如果您的 URL 中包含 ?a=b,您也可以有一个 QUERY_STING,但这对于 POST 来说是不正常的。

    【讨论】:

    • 我应该知道的。我现在看到打印垃圾,而不是表单数据。我想是因为我没有解析它,iirc,甚至没有终结符? FCGX_FPrintF(request.out, "%s", request.in);
    • 你有 CONTENT_LENGTH -- 我不知道你是否得到 EOF,但不应该有终结符。 Request.in 不是一个字符串——它是一个流。您可以像使用 FILE* 一样使用它
    • 编辑了我的评论。这看起来对吗?使用 FCGX_InitRequest(&request) 初始化请求
    • 尝试 FCGX_GetStr,传入 CONTENT_LENGTH 和一个足够大的缓冲区以容纳它和一个 \0
    • 我还没有完全解决这个问题,但是你纠正了我忘记的基础知识以及一些新的东西,我正在路上。谢谢!
    猜你喜欢
    • 2020-08-02
    • 1970-01-01
    • 2020-01-18
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2021-06-13
    • 2018-04-22
    相关资源
    最近更新 更多