在 Nginx 中使用 fastcgi 传递请求 headers

Passing request headers using fastcgi in Nginx

我已经退出了一些使用 Oauth(不是 Oauth2)的 API。我们正在将我们所有的网站从 Apache 迁移到 Nginx(使用 fastcgi),我 运行 遇到请求 header 未发送的问题。我已经阅读了很多帖子和 Nginx 文档,但我仍然无法让 header 参数通过。

我正在使用 Postman 发出 API 请求并设置这些 headers:

当我 var_dump($_SERVER); 时,我终于设法让 header 的密钥显示出来,但我无法获得要传递的实际值。

这是我的主要 nginx.conf http 区块:

http {
    include mime.types;
    default_type  application/octet-stream;

    sendfile on;
    keepalive_timeout  6000;
    client_max_body_size 128M;

    gzip  on;
    gzip_comp_level 5;
    gzip_min_length 256;
    gzip_proxied any;
    gzip_vary on;

    gzip_types
    application/atom+xml
    application/javascript
    application/json
    application/rss+xml
    application/vnd.ms-fontobject
    application/x-font-ttf
    application/x-web-app-manifest+json
    application/xhtml+xml
    application/xml
    font/opentype
    image/svg+xml
    image/x-icon
    text/css
    text/plain
    text/x-component;

    include /Users/webdev2/.valet/Nginx/*;
    include servers/*;
    include valet/valet.conf;
}

这是我的 valet.conf:

server {
    listen 80 default_server;
    root /;
    charset utf-8;

    location /41c270e4-5535-4daa-b23e-c269744c2f45/ {
        internal;
        alias /;
        try_files $uri $uri/;
    }

    location / {
        rewrite ^ /Users/webdev2/.composer/vendor/laravel/valet/server.php last;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    access_log off;
    error_log /Users/webdev2/.valet/Log/nginx-error.log;

    error_page 404 /Users/webdev2/.composer/vendor/laravel/valet/server.php;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/Users/webdev2/.valet/valet.sock;
    fastcgi_pass_request_headers on;
    fastcgi_pass_header Authorization;
    fastcgi_pass_header http_oauth_token;
    fastcgi_pass_header oauth_token_secret;
        fastcgi_index /Users/webdev2/.composer/vendor/laravel/valet/server.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /Users/webdev2/.composer/vendor/laravel/valet/server.php;
        fastcgi_read_timeout 300;
    }

    location ~ /\.ht {
        deny all;
    }
}

最后,这是我的 fastcgi_params 文件:

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  $request_filename;
fastcgi_param SCRIPT_NAME  $fastcgi_script_name;
fastcgi_param REQUEST_URI  $request_uri;
fastcgi_param DOCUMENT_URI  $document_uri;
fastcgi_param DOCUMENT_ROOT  $document_root;
fastcgi_param SERVER_PROTOCOL  $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE  nginx/$nginx_version;
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 HTTPS   $https if_not_empty;
fastcgi_param REDIRECT_STATUS  200;
fastcgi_param HTTP_PROXY  "";
fastcgi_param HTTP_AUTHORIZATION $http_authorization;
fastcgi_param OAUTH_TOKEN $http_oauth_token;
fastcgi_param OAUTH_TOKEN_SECRET $http_oauth_token_secret;

这是 var_dump($_SERVER) 的响应图像。注意:此 var_dump 是在调用应用程序中的任何其他内容之前。

好吧,经过 2 天的深入研究并试图解决这个问题,我终于让它工作了。缺少的部分是添加这一行:

underscores_in_headers on;

在我的主要 http 块中 nginx.conf。所以,这是我的 nginx.conf 的最终 http 块的样子:

http {
    include mime.types;
    default_type  application/octet-stream;

    sendfile on;
    keepalive_timeout  6000;
    client_max_body_size 128M;

    gzip  on;
    gzip_comp_level 5;
    gzip_min_length 256;
    gzip_proxied any;
    gzip_vary on;

    gzip_types
    application/atom+xml
    application/javascript
    application/json
    application/rss+xml
    application/vnd.ms-fontobject
    application/x-font-ttf
    application/x-web-app-manifest+json
    application/xhtml+xml
    application/xml
    font/opentype
    image/svg+xml
    image/x-icon
    text/css
    text/plain
    text/x-component;

    underscores_in_headers on; # This beauty right here :D

    include /Users/webdev2/.valet/Nginx/*;
    include servers/*;
    include valet/valet.conf;
}