如何在 CGI Bash 脚本中读取 HTTP header 值

How to read an HTTP header value in a CGI Bash script

我有一个 CGI Bash 脚本 hw.sh 位于服务器 运行 Nginx 上。使用以下命令调用脚本:

curl -s -D - -H "range: bytes=1-8" -H "Connection: close" -X GET http://server_ip/cgi-bin/hw.sh?path=/some/path/to/data/ 

我需要在 hw.sh 中获取 range 请求 header 的值。请帮助我弄清楚如何实现它。

HTTP header 通常作为 environment variables 传递给 CGI 程序。但并非总是如此。

通常,您在 CGI 程序中访问 header 值的方式取决于 Web 服务器处理 header 的方式。 header 可能会被修改,甚至被删除。例如,在 Nginx 配置中,可以通过自定义 FastCGI 参数传递 range header 的值:

fastcgi_param RANGE $http_range;

在这种情况下,很可能会调用环境变量 RANGE,但最终取决于协议 driver 的实现。由于服务器配置,header 甚至可能会被丢弃。例如,当范围超过 5 个时,以下 Apache 2 配置会删除范围 header:

SetEnvIf Range (,.*?){5,} bad-range=1
RequestHeader unset Range env=bad-range

因此,一般无法预测环境变量的名称,甚至无法预测在CGI程序中是否可用。

但是,如果 header 在脚本中 可用,它将通过环境变量可用。您可以通过检查 env 命令的输出找到确切的名称。

以下应该适用于 Apache2 的默认设置:

#!/bin/bash -
printf '%s\n\n' 'Content-type: text/html'
printf '>>> %s <<< \n' "$HTTP_RANGE"
exit 0

示例输出

'http://apache-test.local/cgi-bin/test.sh?sdfdsf' 
HTTP/1.1 200 OK
Date: Thu, 10 Nov 2016 08:17:23 GMT
Server: Apache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

>>> bytes=1-8 <<<