2016-11-10 5 views
1

J'ai un script CGI Bash hw.sh situé sur un serveur exécutant Nginx. Le script est appelé avec la commande suivante:Comment lire une valeur d'en-tête HTTP dans un script CGI Bash

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/ 

J'ai besoin de récupérer la valeur de l'en-tête de demande range au sein hw.sh. S'il vous plaît aidez-moi à comprendre comment cela peut être réalisé.

Répondre

1

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 <<<