16

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.

2 Answers 2

13

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.

Sign up to request clarification or add additional context in comments.

Comments

5

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;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.