FastCGI 和查询字符串(在 C 中工作)
FastCGI and Query Strings (working in C)
只是一个关于使用 FastCGI 的快速问题。到目前为止,我已经编程了大约一个月,我发现很难全神贯注于 FastCGI。
基本上这是我的问题。
我该如何设置我的查询字符串?
从编程的角度来看,我什至可以 "set" 吗?
如果是我必须设置的东西,我应该在哪里设置?
代码:
while(FCGI_Accept() >= 0) {
if (getenv("QUERY_STRING") != NULL)
{
strcpy(query_string, getenv("QUERY_STRING"));
if (query_count == 0)
{
printf("Content-type: text/html\r\n\r\n");
printf("Query string has no data pairs!\n");
continue;
}
}
else
{
printf("Content-type: text/html\r\n\r\n");
printf("Query string does not exist!\n");
continue;
}
}
下面的代码总是returns NULL
for getenv(QUERY_STRING)
.
所有表单变量都在查询字符串中从浏览器传递到 http 服务器(对于 GET http 请求不是 POST)
html 页面通常会有 html 表单和各种表单变量
例如
<HTML>
<BODY>
<FORM METHOD=GET ACTION="http://localhost:8888/login.cgi">
<input name="ID" type="text">
<input name=submit type="submit" value="Submit">
</FORM>
</BODY>
</HTML>
用户通常会通过单击提交按钮(这只是另一个表单变量)来填写表单并提交,浏览器将 GET 请求发送到由 URL 标识为 http://localhost:8888/login.cgi?ID=aa&submit=Submit 的网络服务器,其中 localhost:8888 标识 web 服务器所在的 ip 和端口 运行,/login.cgi 告诉 web 服务器哪个 cgi 将服务于给定的 http 请求,查询字符串是后面的文本?即ID=aa&submit=提交.
网络服务器或(网络服务器提供的库绑定到CGI)解析http请求数据,包括查询字符串,http请求头,并将它们作为环境变量传递给cgi程序。查询字符串在环境变量 QUERY_STRING 中传递。 CGI 程序应该在其应用程序逻辑中使用这些值
FastCGI 不基于环境变量工作,这就是为什么您无法使用 getenv 从网络服务器获取任何信息。
相反,FastCGI 在网络服务器和 FastCGI 进程之间使用套接字接口(即 运行 永久采用守护程序样式),即您的 FastCGI 守护程序在 TCP 套接字或 Unix 套接字上侦听传入请求。
我建议查看此网页,其中包含 FastCGI 守护程序的解释以及各种编程语言(包括 C)的示例代码:
https://www.hiawatha-webserver.org/howto/cgi_and_fastcgi
只是一个关于使用 FastCGI 的快速问题。到目前为止,我已经编程了大约一个月,我发现很难全神贯注于 FastCGI。
基本上这是我的问题。
我该如何设置我的查询字符串?
从编程的角度来看,我什至可以 "set" 吗?
如果是我必须设置的东西,我应该在哪里设置?
代码:
while(FCGI_Accept() >= 0) {
if (getenv("QUERY_STRING") != NULL)
{
strcpy(query_string, getenv("QUERY_STRING"));
if (query_count == 0)
{
printf("Content-type: text/html\r\n\r\n");
printf("Query string has no data pairs!\n");
continue;
}
}
else
{
printf("Content-type: text/html\r\n\r\n");
printf("Query string does not exist!\n");
continue;
}
}
下面的代码总是returns NULL
for getenv(QUERY_STRING)
.
所有表单变量都在查询字符串中从浏览器传递到 http 服务器(对于 GET http 请求不是 POST) html 页面通常会有 html 表单和各种表单变量 例如
<HTML>
<BODY>
<FORM METHOD=GET ACTION="http://localhost:8888/login.cgi">
<input name="ID" type="text">
<input name=submit type="submit" value="Submit">
</FORM>
</BODY>
</HTML>
用户通常会通过单击提交按钮(这只是另一个表单变量)来填写表单并提交,浏览器将 GET 请求发送到由 URL 标识为 http://localhost:8888/login.cgi?ID=aa&submit=Submit 的网络服务器,其中 localhost:8888 标识 web 服务器所在的 ip 和端口 运行,/login.cgi 告诉 web 服务器哪个 cgi 将服务于给定的 http 请求,查询字符串是后面的文本?即ID=aa&submit=提交.
网络服务器或(网络服务器提供的库绑定到CGI)解析http请求数据,包括查询字符串,http请求头,并将它们作为环境变量传递给cgi程序。查询字符串在环境变量 QUERY_STRING 中传递。 CGI 程序应该在其应用程序逻辑中使用这些值
FastCGI 不基于环境变量工作,这就是为什么您无法使用 getenv 从网络服务器获取任何信息。
相反,FastCGI 在网络服务器和 FastCGI 进程之间使用套接字接口(即 运行 永久采用守护程序样式),即您的 FastCGI 守护程序在 TCP 套接字或 Unix 套接字上侦听传入请求。
我建议查看此网页,其中包含 FastCGI 守护程序的解释以及各种编程语言(包括 C)的示例代码: https://www.hiawatha-webserver.org/howto/cgi_and_fastcgi