【问题标题】:Send additional header to FastCGI backend with nginx使用 nginx 向 FastCGI 后端发送附加标头
【发布时间】:2012-03-16 21:55:13
【问题描述】:

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

有人知道如何做到这一点吗?我不想使用额外的 nginx 模块,因为该解决方案必须可以轻松部署在广泛的客户系统上。

【问题讨论】:

    标签: nginx http-headers fastcgi


    【解决方案1】:

    上面 nginx wiki 文章的 URL 已损坏。

    nginx 通过以 $http_ 为前缀的变量公开请求标头值,因此 HTTP_USER_AGENT 的请求标头可通过 $http_user_agent 获得。

    同样,名为 CHICKEN_SOUP 的请求标头可通过 $http_chicken_soup 获得。

    下面的示例展示了如何将 Authorization HTTP 请求标头传递给在 php-fpm(PHP FastCGI 进程管理器)下运行的 PHP 脚本。

    location ~ \.php$ {
        fastcgi_pass   unix:/path/to/socket;
        fastcgi_index  index.php;
        fastcgi_param  HTTP_AUTHORIZATION $http_authorization;
        ... other settings
    }
    

    【讨论】:

    • 这是本主题的最佳答案。这种配置效果很好。其他答案不起作用。但有一些提示。通常会删除任何下划线。那么例如变量 CHICKEN_SOUP 在环境中显示为 CHICKENSOUP 和 HTTP_CHICKENSOUP 如果您添加 config 'fastcgi_param CHICKENSOUP $http_chickensoup 。不幸的是,$http_chicken_soup 无法访问,我花了一些时间来调试这个。
    • 这个例子毫无意义。 NGINX 会自动将 all 客户端请求标头传递给 PHP-FPM。
    【解决方案2】:

    Nginx 现在有:

    fastcgi_pass_header 'Cache-Control: no-cache, must-revalidate';
    

    如果您要添加请求中尚未指定的标头,则可以在您的位置规则中使用它。默认情况下,fastcgi 使用:

    fastcgi_pass_request_headers on;
    

    这会将请求中的所有传入标头传递给 fastcgi。

    【讨论】:

    • @Dyna 不,不应该。 @Derek Dowling:您的第一个解决方案是错误的,fastcgi_pass_header 与您解释的相反:它允许将来自 fastcgi 服务器回复的标头传递回客户端,而不是从初始请求到 fastcgi 服务器。该指令的目的是在某些特定情况下保留可以由反向代理(如X-Accel-BufferingX-Accel-Limit-Rate 等)解释的回复特殊标头。
    • 根据文档不正确:允许将其他禁用的标头字段从 FastCGI 服务器传递到客户端。
    【解决方案3】:

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

    location / {
        more_set_input_headers 'Foo: bar baz';
        ...
    }
    

    【讨论】:

    • 完全没有必要。由@zoot 编写的resolve 对标准模块来说就足够了。那么你不需要任何重新编译。
    【解决方案4】:

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

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

    http://wiki.nginx.org/HttpFcgiModule#Parameters.2C_transferred_to_FastCGI-server.

    fastcgi_param

    语法:fastcgi_param 参数值

    http://wiki.nginx.org/HttpFcgiModule#fastcgi_param

    【讨论】:

    • 我也发现了。但是,fastcgi_param 用于设置发送到 FastCGI 服务器的变量 - 而不是 HTTP 标头。问题是您无法从应用程序(这是一个 php 脚本或 asp.net webapp)中访问 fastcgi 变量。
    • 我现在使用'fastcgi_param HTTP_X_MYVAR "myvalue";'让它工作了。如果变量名称以 HTTP_ 开头,它似乎会被复制到标头中。但是,这是未记录的并且是特定于实现的,并且可能会随着未来的版本而改变
    • 好发现,戴纳。我会记下的。
    • 您好,请查看 PHP 中的 $_SERVER 以查看 fastcgi_params。 stackoverflow.com/questions/8098927/…
    • @Dynalon 不正确。 FastCGI 参数可在 PHP 中的 $_SERVER 超全局中访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2011-02-21
    • 2023-03-08
    • 2015-07-01
    • 2011-06-02
    相关资源
    最近更新 更多