Вопрос

I have a custom FastCGI application behind Nginx and I'm struggling to get Nginx to return anything other than a 200 status code.

I've tried the following:

  • Setting fast_cgi_intercept_errors on.

  • Returning codes via ApplicationStatus in the EndRequest.

  • Returning Errors on the StdError stream.

  • Sending any of following headers:

    • "Status: 404 Not Found"

    • "HTTP/1.1 404 Not Found"

    • "X-PHP-Response-Code: 404"

    • "Status: 404 Not Found;"

    • "HTTP/1.1 404 Not Found;"

    • "X-PHP-Response-Code: 404;"

Any help would be great, I'm very stuck.

Это было полезно?

Решение

nginx discards the "HTTP/1.1 304 Not Modified\r\n".

nginx uses (and eats) the Status header.

If my fastcgi program returns the header "Status: 304\r\n".

Then I get this response:

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

As you can see there is no Status: 304 header. It has been eaten by nginx.

Другие советы

Here is an example of how you can return a 404 status code using fcgi and C++.

#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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top