Les en-têtes HTTP sont généralement transmis aux programmes CGI sous la forme environment variables. Mais ce n'est pas toujours le cas.
Généralement, la façon dont vous accédez aux valeurs d'en-tête dans un programme CGI dépend de la façon dont le serveur Web traite les en-têtes. Les en-têtes peuvent être modifiés, voire supprimés. Par exemple, dans une configuration Nginx, il est possible de passer la valeur de l'en-tête range
via le paramètre FastCGI personnalisé:
fastcgi_param RANGE $http_range;
Il ce cas, il est probable que la variable d'environnement sera appelé RANGE
, mais cela dépend finalement sur la mise en œuvre du pilote de protocole. Les en-têtes peuvent même être supprimés en raison de la configuration du serveur. Par exemple, la configuration Apache 2 suivant supprime l'en-tête de gamme quand il y a plus de 5 gammes:
SetEnvIf Range (,.*?){5,} bad-range=1
RequestHeader unset Range env=bad-range
Ainsi, il est généralement impossible de prédire le nom de la variable d'environnement, et même si elle sera disponible en le programme CGI.
Cependant, si l'en-tête est disponible dans le script, il sera disponible via une variable d'environnement. Vous pouvez trouver le nom exact en examinant la sortie de la commande env
.
Ce qui suit devrait fonctionner avec les paramètres par défaut pour Apache2:
#!/bin/bash -
printf '%s\n\n' 'Content-type: text/html'
printf '>>> %s <<< \n' "$HTTP_RANGE"
exit 0
Exemple de sortie
'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 <<<