linux - 如何读取 CGI Bash 脚本中的 HTTP header 值

标签 linux bash curl cgi fastcgi

我有一个 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.shrange 请求 header 的值。请帮我弄清楚如何实现它。

最佳答案

HTTP header 通常以 environment variables 形式传递给 CGI 程序。但情况并非总是如此。

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

fastcgi_param RANGE $http_range;

在这种情况下,环境变量可能会被称为RANGE,但它最终取决于协议(protocol)驱动程序的实现。由于服务器配置, header 甚至可能被丢弃。例如,以下 Apache 2 配置会在范围超过 5 个时删除范围 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 <<< 

关于linux - 如何读取 CGI Bash 脚本中的 HTTP header 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40521304/

相关文章:

elasticsearch - Elasticsearch 不支持内容类型 header [application/x-www-form-urlencoded]

linux - 控制客户端(linux)

linux - 分析接管原始磁盘的 vmcore

linux - 在命令中提供密码并执行

linux - 将 sed 与包含 url 的变量一起使用

bash:运行带引号的命令时出现问题

arrays - 如何在 Bash 中将字符串拆分为数组?

linux - BASH : How to make a script that make “tail -f” always logging the last file in a directory,直播

php - 有没有等同于php的curl_getinfo的python库?

bash - 如何让curl等待响应然后继续执行代码