FastCGI和Nginx - 返回HTTP状态

时间:2014-02-17 10:00:35

标签: nginx fastcgi

我在Nginx后面有一个自定义的FastCGI应用程序,我很难让Nginx返回除200状态代码之外的任何内容。

我尝试了以下内容:

  • 设置fast_cgi_intercept_errors。

  • 通过ApplicationStatus中的EndRequest返回代码。

  • 在StdError流上返回错误。

  • 发送以下任何标题:

    • “状态:404未找到”

    • “找不到HTTP / 1.1 404”

    • “X-PHP-Response-Code:404”

    • “状态:404未找到;”

    • “找不到HTTP / 1.1 404;”

    • “X-PHP-Response-Code:404;”

任何帮助都会很棒,我很困难。

2 个答案:

答案 0 :(得分:2)

nginx会丢弃"HTTP/1.1 304 Not Modified\r\n"

nginx使用(和吃掉)Status标题。

如果我的fastcgi程序返回标题"Status: 304\r\n"

然后我得到了这个回复:

HTTP/1.1 304
Server: nginx/1.6.2
Date: Sat, 21 May 2016 10:49:27 GMT
Connection: keep-alive

正如您所看到的,没有Status: 304标头。它被nginx吃掉了。

答案 1 :(得分:1)

以下是如何使用fcgi和C ++返回404状态代码的示例。

#include <iostream>
#include "fcgio.h"

using namespace std;

int main(void)
{
  streambuf * cin_streambuf = cin.rdbuf();
  streambuf * cout_streambuf = cout.rdbuf();
  streambuf * cerr_streambuf = cerr.rdbuf();

  FCGX_Request request;

  FCGX_Init();
  FCGX_InitRequest(&request, 0, 0);

  while (FCGX_Accept_r(&request) == 0)
  {
    fcgi_streambuf cin_fcgi_streambuf(request.in);
    fcgi_streambuf cout_fcgi_streambuf(request.out);
    fcgi_streambuf cerr_fcgi_streambuf(request.err);

    cin.rdbuf(&cin_fcgi_streambuf);
    cout.rdbuf(&cout_fcgi_streambuf);
    cerr.rdbuf(&cerr_fcgi_streambuf);

    cout << "Status: 404\r\n"
         << "Content-type: text/html\r\n"
         << "\r\n"
         << "<html><body>Not Found</body></html>\n";
  }

  cin.rdbuf(cin_streambuf);
  cout.rdbuf(cout_streambuf);
  cerr.rdbuf(cerr_streambuf);

  return 0;
}