Nginx Problem with fastcgi_param

We’ve been running Nginx(0.5.33)+FastCGI(php-cgi 5.1.6) on Fedora 6 for
1 week now and very happy with it. Before this, we were using Nginx as
strictly a HTTP load balancer. I have encountered an issue migrating to
FastCGI, which is that HTTP_HOST cannot be set using fastcgi_param. It
seems that no matter what I pass (e.g. foobar.com), Nginx is not
honoring it, passing the real HTTP_HOST of the request instead. The
other variables like SCRIPT_FILENAME and SCRIPT_NAME are getting set
properly if I change them.

Is there something I am doing wrong or is this a known issue?

Best,

Erik

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $script_filename;
fastcgi_param SCRIPT_NAME $script_name;
fastcgi_param REQUEST_URI $uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param HTTP_HOST foobar.com;

I don’t believe HTTP_HOST is one you set. I think it’s determined by PHP

This is what I set (SERVER_NAME in nginx seems to be different than
HTTP_HOST)

fastcgi_param SERVER_NAME $http_host;

Then the people’s scripts that were using $_SERVER[‘SERVER_NAME’] work
properly. Typically I try to use $_SERVER[‘HTTP_HOST’] …

$http_host is a variable in nginx, but I think HTTP_HOST in PHP is
being set on its own. not via a param you pass. could be a possible
“bug” in PHP to say “if I want to override default PHP behavior for
HTTP_HOST, I should be able to do it”

Could this be resolved with $_SERVER[‘SERVER_NAME’] in your PHP code?
and/or in combination with changing it to be $http_host in the fastcgi
params?

From my past work with the FastCGI protocol, I believe all the NV pairs
(params) set using the FastCGI protocol are available to PHP in the
_SERVER global. Also, HTTP_HOST is not supposed to be derived by PHP, as
it reflects the client-side “Host:” header (versus SERVER_NAME which is
the Nginx configured host), so the only way to pass it to PHP would be
through the FCGI protocol (since raw headers are not passed).

You’re entirely correct though that SERVER_NAME gets set with whatever
we pass, so we’ll have to adjust our stuff for that in the meanwhile.

Thanks!

Erik

On Tue, May 13, 2008 at 04:06:54PM -0700, Erik Osterman wrote:

Is there something I am doing wrong or is this a known issue?
nginx passes HTTP headers to FastCGI as is and does not allow to
override them. Unlike proxied server, FastCGI usually does not depend on
Host header.