2016-11-10 46 views
1

我有一个位于运行Nginx的服务器上的CGI Bash脚本hw.sh。该脚本调用以下命令:如何读取CGI Bash脚本中的HTTP标头值

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请求头的值。请帮我弄清楚它是如何实现的。

回答

1

HTTP标头通常被传递给CGI程序environment variables。但情况并非总是如此。

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

fastcgi_param RANGE $http_range; 

它这种情况下,可能的是,环境变量将被称为RANGE,但最终取决于关于协议驱动程序的实现。由于服务器配置,标题甚至可能会被丢弃。例如,下面的Apache 2配置滴时有超过5个范围的范围内标头:

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

因此,通常是不可能预测的环境变量的名称,它甚至是否将在可用的CGI程序。

但是,如果脚本中可用的标头,它将通过环境变量提供。您可以通过检查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 <<<