使用nginx向FastCGI后端发送附加头

使用nginx向FastCGI后端发送附加头,nginx,http-headers,fastcgi,Nginx,Http Headers,Fastcgi,我将nginx与几个fastcgi后端(php-cgi、mod-mono-fastcgi4)一起使用。现在我需要向fastcgi后端发送一个额外的http头,基本上与使用nginx作为反向代理时的proxy_set_头相同。但根据我的发现,nginx中没有fastcgi_set_头这样的东西 有人知道怎么做吗?我不想使用额外的nginx模块,因为该解决方案必须能够轻松地部署在广泛的客户系统上。我快速查看了手册,我认为您会发现最接近的是传递fastcgi参数: 请求头以参数的形式传输到FastCG

我将nginx与几个fastcgi后端(php-cgi、mod-mono-fastcgi4)一起使用。现在我需要向fastcgi后端发送一个额外的http头,基本上与使用nginx作为反向代理时的proxy_set_头相同。但根据我的发现,nginx中没有fastcgi_set_头这样的东西


有人知道怎么做吗?我不想使用额外的nginx模块,因为该解决方案必须能够轻松地部署在广泛的客户系统上。

我快速查看了手册,我认为您会发现最接近的是传递fastcgi参数:

请求头以参数的形式传输到FastCGI服务器。在从FastCGI服务器运行的应用程序和脚本中,这些参数通常可以以环境变量的形式访问。例如,标题“用户代理”作为参数HTTP\u User\u agent传输。除了HTTP请求的头之外,还可以借助指令fastcgi_param传输任意参数

fastcgi_参数

语法:fastcgi_param参数值


您可以使用第三方模块执行此操作。构建包含此模块的nginx后,您可以在配置中执行以下操作:

location / {
    more_set_input_headers 'Foo: bar baz';
    ...
}
Nginx现在有:

fastcgi_pass_header 'Cache-Control: no-cache, must-revalidate';
如果要添加请求中尚未指定的标头,则可以在位置规则中使用。默认情况下,fastcgi使用:

fastcgi_pass_request_headers on;

它会将所有传入的头从请求传递到fastcgi。

以上nginx wiki文章的URL已断开

nginx通过前缀为$http\u的变量公开请求头值,因此http\u USER\u AGENT的请求头可通过$http\u USER\u AGENT获得

同样,名为CHICKEN_SOUP的请求头也可以通过$http_CHICKEN_SOUP获得

下面的示例显示了如何将授权HTTP请求头传递给在PHP fpm(PHP FastCGI process manager)下运行的PHP脚本


我也发现了。但是,fastcgi_param用于设置发送到fastcgi服务器的变量,而不是HTTP头。问题是您无法从应用程序(php脚本或asp.net Web应用程序)中访问fastcgi变量。我现在使用“fastcgi参数HTTP_X_MYVAR“myvalue”;”使其正常工作。如果变量名以HTTP_u开头,它似乎会被复制到头中。然而,这是未记录的和特定于实现的,并且可能会随着将来的版本而改变Good find,Dyna。我会记下来的。大家好,请查看PHP中的$u服务器以查看fastcgi\ u参数@Dynalon是不正确的。FastCGI参数可以在PHP中的
$\u服务器中访问。@Dyna不,不应该@德里克·道林:您的第一个解决方案是错误的,
fastcgi\u pass\u header
与您的解释相反:它允许将来自fastcgi服务器的头回复传递回客户端,而不是从最初的请求传递回fastcgi服务器。本指令的目的是在回复中保留可由反向代理解释的特殊标题(如
X-Accel-Buffering
X-Accel-Limit-Rate
等)在某些特定情况下。根据doc,它是不正确的:允许将其他禁用的头字段从FastCGI服务器传递到客户端。这完全没有必要。通过@zoot解析wroten对于标准模块来说已经足够了。那么你就不需要重新编译了。这是这个主题的最佳答案。此配置运行良好。其他答案不起作用。但有一些暗示。通常删除所有下划线。然后,例如,如果您添加配置'fastcgi_param CHICKENSOUP$HTTP_CHICKENSOUP',则环境中的变量CHICKEN_SOUP将同时显示为CHICKENSOUP和HTTP_CHICKENSOUP。不幸的是$http_chicken_soup是不可访问的,我已经花了一些时间来调试这个。这个例子毫无意义。NGINX将自动将所有客户端请求头传递给PHP-FPM。
location ~ \.php$ {
    fastcgi_pass   unix:/path/to/socket;
    fastcgi_index  index.php;
    fastcgi_param  HTTP_AUTHORIZATION $http_authorization;
    ... other settings
}