Zum Inhalt springen

Apache/14 CGI/3 Umgebungsvariablen

Aus Foxwiki

Apache/14 CGI/3 Umgebungsvariablen - Apache/CGI/Umgebungsvariablen

Beschreibung

Umgebungsvariablen ==

Für die CGI-Programmierung ist es sehr angenehm, dass Apache eine Reihe von Informationen über sich selbst, über den anfragenden Client und die Details der Anfrage selbst als Umgebungsvariablen veröffentlicht. Darüber hinaus existieren mit mod_env und mod_setenvif zwei Standardmodule, die die Manipulation dieser Variablen ermöglichen. In diesem Abschnitt finden Sie zunächst eine Übersicht über die verfügbaren Umgebungsvariablen und lernen anschließend die Konfigurationsdirektiven kennen, mit denen sich eigene Variablen setzen lassen.

Der Zugriff auf Umgebungsvariablen aus CGI-Programmen heraus funktioniert je nach Programmiersprache unterschiedlich:

  • In Perl liegen alle Variablen in dem Hash1 %ENV vor, in dem die Variablennamen die Schlüssel und ihre Werte die Elemente sind. $ENV{'HTTP_USER_

AGENT'} liefert also beispielsweise den Namen und die Version des anfragenden Client-Programms.

  • In PHP (Näheres in Kapitel 15, Technologien zur Webprogrammierung)

erfüllt das Array $_SERVER dieselbe Aufgabe. Auch hier bilden die Variablennamen die Schlüssel, da es keinen Unterschied zwischen Arrays und Hashes

1 Ein Hash entspricht dem Konstrukt, das in anderen Sprachen als assoziatives Array bezeichnet wird: Die Indizes sind keine Nummern, sondern Strings. In Perl wird ein ganzer Hash durch das Präfix % gekennzeichnet (beispielsweise %hash). Der Zugriff auf ein einzelnes Element erfolgt durch die Angabe des Schlüssels in geschweiften Klammern. Beispiel: $hash{’info’}. Um einen neuen Hash mit Anfangswerten zu erzeugen, können Sie folgendes Schema verwenden: my %hash = (key1 => ’Wert1’, key2 => ’Wert2’};.

gibt. $_SERVER ['REQUEST_METHOD'] beispielsweise liefert die HTTP-Anfrage-Methode zurück.

  • In Java (Näheres dazu ebenfalls im nächsten Kapitel) können Umgebungsvariablen von Haus aus nicht gelesen werden, weil Java-Programme in einer virtuellen Maschine laufen, die nichts über die tatsächliche Systemumgebung

weiß. Die Klasse HttpServletRequest der Servlet-API bietet dafür allerdings eine Reihe von Methoden nach dem Schema getVariablenname(). Anstelle der Unterstriche werden nach Java-Konvention große Anfangsbuchstaben für das jeweils nächste Wort verwendet. getServerName() liefert beispielsweise den Wert von SERVER_NAME, also den DNS-Namen des Webservers.

  • Im Web kursieren einige alte CGI-Beispiele, die als UNIX-Shell-Skripte

geschrieben sind (was aus Sicherheits- und Performance-Gründen nicht zu empfehlen ist). Hier können die Werte der Umgebungsvariablen einfach als $VARIABLEN_NAME angesprochen werden, beispielsweise $SCRIPT_NAME für den Pfad des aktuellen CGI-Skripts. Unter Windows können analog dazu die (noch weniger empfehlenswerten) MS-DOS-Batch-Dateien mit der Dateiendung .bat verwendet werden; hier lautet das Schema %VARIABLEN_NAME%, also beispielsweise %QUERY_ STRING% für an die URL angehängte Formulardaten.

14.3.1 Die Umgebungsvariablen im Überblick

Tabelle 14.1 zeigt die CGI-Umgebungsvariablen im Überblick. Die Liste ist im Prinzip vollständig; es wurden allerdings nicht alle automatisch aus den AnfrageHeadern erzeugten Variablen aufgelistet. Der Aufbau dieser speziellen Variablen ist immer derselbe: Dem (hier vollständig in Großbuchstaben geschriebenen) Namen des Headers (zu finden in Kapitel 2, Funktionsweise von Webservern) wird das Präfix HTTP_ vorangestellt. Beispiele: HTTP_HOST (übermittelter Hostname der Anfrage) oder HTTP_COOKIE (an den Server übermittelte Cookies).

Variable Beschreibung Beispielwert SERVER_SOFTWARE Bezeichnung und Version des Apache/2.3.15 (UNIX) Webservers; Apache-Direktive: ServerTokens (siehe Kapitel 6, Grundkonfiguration) SERVER_NAME Hostname oder IP-Adresse des www.mynet.de Servers ServerName (siehe Kapitel 6, Grundkonfiguration) GATEWAY_INTERFACE verwendete CGI-Version CGI/1.1

Tabelle 14.1 Übersicht über die Standard-CGI-Umgebungsvariablen

Umgebungsvariablen 14.3

Variable Beschreibung Beispielwert SERVER_PROTOCOL Name und Version des Anwen- HTTP/1.1 dungsprotokolls, das die Anfrage übermittelt (normalerweise HTTP) SERVER_PORT TCP-Port des Servers: Listen 80 (siehe Kapitel 6, Grundkonfiguration) REQUEST_METHOD HTTP-Anfrage-Methode GET PATH_INFO Dies ist die zusätzliche Pfadan- /more/path/info gabe hinter dem eigentlichen Namen des Skripts. Existiert nur, wenn AcceptPathInfo gesetzt ist. PATH_TRANSLATED vom Server umgewandelte /translated/path/info Variante von PATH_INFO SCRIPT_NAME Pfad des aktuellen Skripts /cgi-bin/script.pl selbst QUERY_STRING Inhalt des URL-Anhangs hinter artikelnr=102 dem ? REMOTE_HOST Hostname des anfragenden xdsl-213-196-226-224. Clients, falls verfügbar (sonst netcologne.de identisch mit REMOTE_ADDR) REMOTE_ADDR IP-Adresse des anfragenden 213.196.226.224 Clients AUTH_TYPE verwendete Art der Benutze- Basic rauthentifizierung (siehe Kapitel 9, Authentifizierung, Autorisierung und Zugriffskontrolle) REMOTE_USER Name des entfernten Benut- Gast zers, falls Authentifizierung verwendet wurde REMOTE_IDENT RFC-1431-Identität des ent- i. d. R. nicht vorhanden fernten Benutzers, falls verfüg- (spezielles identd-Format) bar CONTENT_TYPE MIME-Type des Bodys einer application/ POST- oder PUT-Anfrage (durch x-www-form-urlencoded Content-Type-Header angegeben)

Tabelle 14.1 Übersicht über die Standard-CGI-Umgebungsvariablen (Forts.)

Variable Beschreibung Beispielwert CONTENT_LENGTH Anzahl der Bytes im Body einer 32768 POST- oder PUT-Anfrage HTTP_* (beispielsweise HTTP_USER_ Alle HTTP-Header der Client- Mozilla/5.0 (Windows; AGENT oder HTTP_ACCEPT) Anfrage (siehe Kapitel 2, U; Windows 6.0; de; Funktionsweise von Webser- rv:1.9.0.3) Gecko/ vern) werden mit dem Präfix 2008092417 Firefox/3.0.3 HTTP_ versehen und an das CGI-Skript durchgereicht.

Tabelle 14.1 Übersicht über die Standard-CGI-Umgebungsvariablen (Forts.)

14.3.2 Umgebungsvariablen in der Apache-Konfiguration setzen

Umgebungsvariablen dienen nicht ausschließlich der CGI-Programmierung. Da sie jedoch für CGI eine besonders wichtige Bedeutung haben, ist dieses Kapitel trotzdem ein passender Ort für die Apache-Konfigurationsdirektiven, die dem Setzen von Umgebungsvariablen dienen. Für diese Aufgabe gibt es zwei Standardmodule: mod_env ist das grundlegende Modul zum Setzen der Variablen, während mod_setenvif verschiedene Bedingungen auswerten kann, bevor Variablen gesetzt werden. Darüber hinaus bestimmt die core-Direktive AcceptPathInfo, ob die Umgebungsvariablen PATH_INFO und PATH_TRANS-LATED generiert werden.

Wie Sie bereits in Kapitel 8, Weiterleitungen und Indizes, erfahren haben, lassen sich ähnliche Aufgaben auch mithilfe von mod_rewrite umsetzen.

SetEnv Umgebungsvariablen setzen

Modul mod_env Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (FileInfo) Syntax SetEnv Umgebungsvariable Wert Standardwert nicht gesetzt

Diese Direktive setzt die angegebene Variable auf den gewünschten Wert. Sie kann dann auf die oben beschriebene Art und Weise in CGI-Skripten ausgelesen werden. Es ist leider nicht möglich, die Werte der aus der Anfrage übernommenen oder vom Server selbst generierten Variablen zu überschreiben. Der Sinn der Konfigurationsanweisung besteht vielmehr darin, beliebige zusätzliche Variablen zu definieren. Beispiel:

SetEnv DATA_PATH /etc/misc_data

Umgebungsvariablen 14.3

PassEnv Shell-Umgebungsvariablen an CGI-Skripte weitergeben

Modul mod_env Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (FileInfo) Syntax PassEnv Umgebungsvariable [Umgebungsvariable ...] Standardwert nicht gesetzt

Neben den CGI-Umgebungsvariablen, die Apache automatisch an CGI-Skripte weitergibt, existieren auch die Umgebungsvariablen der Shell. Mithilfe von PassEnv können Sie diese ebenfalls an alle CGI-Programme durchreichen. Das sollten Sie allerdings mit Umsicht tun, weil manche Variablen aus Sicherheitsgründen nicht in die relativ ungeschützte CGI-Umgebung gehören. Das folgende Beispiel leitet die Umgebungsvariable SHELL (den Pfad der aktuellen Login-Shell) an CGI-Skripte weiter:

PassEnv SHELL

UnsetEnv Umgebungsvariable entfernen

Modul mod_env Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (FileInfo) Syntax UnsetEnv Umgebungsvariable [Umgebungsvariable ...] Standardwert nicht gesetzt

Diese Direktive ermöglicht es, eine zuvor gesetzte Variable in einem untergeordneten Kontext wieder zu entfernen. Beispiel:

UnsetEnv DATA_PATH

SetEnvIf Umgebungsvariablen je nach Bedingungen in der Anfrage setzen

Modul mod_setenvif Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (FileInfo) Syntax SetEnvIf Attribut RegExp [!]Umgebungsvariable[=Wert] [[!] Umgebungsvariable[=Wert] ...] Standardwert nicht gesetzt

Die Direktive SetEnvIf setzt eine Variable, wenn eine bestimmte Umgebung zutrifft beziehungsweise nicht zutrifft. Das zu überprüfende Attribut kann im Grunde jedes Header-Feld der Client-Anfrage sein (siehe Kapitel 2, Funktionsweise von Webservern). Sie können auch einen regulären Ausdruck verwenden, um eine Gruppe von Headern anzugeben. Zusätzlich sind folgende Attribute definiert:

  • Remote_Host - Hostname des entfernten Client-Rechners
  • Remote_Addr - IP-Adresse des Client-Rechners
  • Server_Addr - IP-Adresse des Server-Hosts
  • Remote_User - User-ID des entfernten Benutzers
  • Request_Method - HTTP-Anfrage-Methode (GET, POST und weitere)
  • Request_Protocol - Protokoll der Client-Anfrage (normalerweise HTTP)
  • Request_URI - die angeforderte Ressource
  • Die zu prüfende Bedingung ist ein beliebiger regulärer Ausdruck.
  • Für die zu setzende Variable gibt es drei verschiedene Optionen:
  • variable (ohne Wertangabe): Die Variable erhält den Wert 1 (gesetzt).
  • !variable entfernt die bereits definierte Variable.
  • variable=Wert setzt die Variable auf den angegebenen Wert.

Hier einige Beispiele:

  • SetEnvIf Request_URI "\.(gif)|(jpg)|(png)$" image_request

Setzt die Variable image_request, wenn die angeforderte URL auf .gif, .jpg oder .png endet.

  • SetEnvIf Referer "www\.google\.([a-z]+)" \

is_google_search=$1 Wenn das Header-Feld Referer den Bestandteil www.google. <beliebige TLD> enthält, wird is_google_search auf die gefundene Top-Level-Domain gesetzt. Damit wissen Sie, dass die angeforderte URL durch eine Google-Suche gefunden wurde. Außerdem erhalten Sie durch die TLD die Information, welche Landesfiliale von Google befragt wurde.

  • SetEnvIf ^X\- .+ extra_headers

Wenn die Anfrage Erweiterungs-Header enthält, die mit X- beginnen (dargestellt durch einen Wert, der mindestens ein Zeichen besitzt), wird die Variable extra_headers gesetzt.

SetEnvIfNoCase Umgebungsvariablen je nach Bedingungen (ohne Unterschied bei Groß-/Kleinschreibung) setzen

Umgebungsvariablen 14.3

Seit Version 1.3 Modul mod_setenvif Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (FileInfo) Syntax SetEnvIfNoCase Attribut RegExp [!]Umgebungsvariable[=Wert] [[!]Umgebungsvariable[=Wert] ...] Standardwert nicht gesetzt

SetEnvIfNoCase funktioniert genau wie SetEnvIf - mit der einzigen Ausnahme, dass bei den Suchmustern nicht zwischen Groß- und Kleinschreibung unterschieden wird.

BrowserMatch Browser-Bedingung zum bedingten Setzen von Umgebungsvariablen

Modul mod_setenvif Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (FileInfo) Syntax BrowserMatch RegExp [!]Umgebungsvariable[=Wert] [[!]Umgebungs-variable[=Wert] ...] Standardwert nicht gesetzt

BrowserMatch vergleicht den Header User-Agent (Eigenname, den das anfragende Client-Programm übermittelt) mit einem regulären Ausdruck und setzt auf dieser Grundlage eine Variable. Im Grunde genommen ist

BrowserMatch RegExp Variable

also lediglich ein Synonym für folgende SetEnvIf-Formulierung:

SetEnvIf User-Agent RegExp Variable

Beispielsweise setzt die folgende Anweisung die Variable is_windows, wenn die User-Agent-Angabe win enthält:

BrowserMatch win is_windows

Speziell für den Einsatz mit BrowserMatch gibt es einige besondere (natürlich auch mit SetEnv oder SetEnvIf verwendbare) Variablen, die das Verhalten von Apache bezüglich der Antwort unmittelbar beeinflussen:

  • downgrade-1.0 - Apache behandelt die Anfrage als HTTP/1.0.
  • force-no-vary - Vor der Auslieferung werden alle Vary-Header aus der Antwort entfernt; einige Clients kommen nicht mit ihnen zurecht.
  • force-response-1.0 - Apache liefert die Antwort im HTTP/1.0-Format.
  • gzip-only-text/html - Wenn diese Variable den Wert 1 hat, werden nur

HTML-Dokumente durch den deflate-Filter komprimiert.

  • no-gzip - Die deflate-Komprimierung wird völlig abgeschaltet.
  • nokeepalive - Deaktiviert persistente Verbindungen.
  • prefer-language - Setzt die bevorzugte Sprache (ein ISO-Sprachkürzel, siehe

Anhang E) für Content-Negotiation.

  • redirect-carefully - Sorgt für besondere Sorgfalt beim Setzen von Weiterleitungs-Headern.
  • suppress-error-charset (seit Apache 2.0.40) - Unterdrückt das Senden einer

Zeichensatzinformation mit servergenerierten Fehlerseiten.

Die bei der Installation automatisch generierte Konfigurationsdatei enthält eine Reihe von BrowserMatch-Anweisungen mit diesen besonderen Variablen, um bekannten Inkompatibilitäten mit bestimmten Clients zu begegnen:

BrowserMatch "Mozilla/2" nokeepalive BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 \ force-response-1.0 BrowserMatch "RealPlayer 4\.0" force-response-1.0 BrowserMatch "Java/1\.0" force-response-1.0 BrowserMatch "JDK/1\.0" force-response-1.0

BrowserMatchNoCase Browser-Bedingung ohne Beachtung von Groß-/Kleinschreibung

Seit Version 1.2 (früher in mod_browser; seit 1.3 in mod_setenvif) Modul mod_setenvif Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (FileInfo) Syntax BrowserMatchNoCase RegExp [!]Umgebungsvariable[=Wert] [[!]Umgebungsvariable[=Wert] ...] Standardwert nicht gesetzt

Diese Direktive ist identisch mit BrowserMatch, außer dass sie nicht zwischen Groß- und Kleinschreibung unterscheidet.

AcceptPathInfo Zulässigkeit von Pfadangaben hinter der eigentlichen URL

Umgebungsvariablen 14.3

Seit Version 2.0.30 Modul core Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (FileInfo) Syntax AcceptPathInfo On|Off|Default Standardwert Default

AcceptPathInfo bestimmt, ob Apache Pfadangaben akzeptiert, die sich hinter der angeforderten URL befinden. Die drei möglichen Werte bedeuten Folgendes:

  • Off

Apache weigert sich, Anfragen anzunehmen, bei denen der Pfad hinter dem angeforderten Dateinamen weitergeht. Wenn /info/test.html beispielsweise eine existierende Datei ist, und ein Client übergibt eine Anfrage mit dem Pfad /info/test.html/extra, dann gibt der Server den Fehler 404 Not Found zurück.

  • On

Wenn AcceptPathInfo eingeschaltet ist, werden zusätzliche Pfadangaben akzeptiert: Eine Anfrage mit der URL /info/test.html/extra liefert die vorhandene Datei /info/test.html aus und speichert den Rest der Pfadangabe in der Umgebungsvariablen PATH_INFO. Darüber hinaus erstellt Apache den zugehörigen absoluten Pfad mithilfe der ServerRoot (im vorliegenden Fall ergibt sich beispielsweise /usr/local/httpd/extra) und stellt ihn als PATH_TRANSLATED zur Verfügung.

  • Default

Dies ist die Voreinstellung: Apache überlässt dem jeweiligen Handler, der die Anfrage bearbeitet, die Entscheidung, ob dieser zusätzliche Pfadangaben akzeptiert oder nicht. Beispielsweise lässt der Handler cgi-script diese Pfadangaben zu, während der core-Handler sie ablehnt.

AllowEncodedSlashes URLs mit codierten Slashes zulassen

Seit Version 2.0.46 Modul core Kontext Server, <VirtualHost> Syntax AllowEncodedSlashes On|Off Standardwert Off

Diese Direktive bestimmt, ob eine URL an irgendeiner Stelle codierte Pfadtrennzeichen (/, unter Windows auch \) enthalten darf - gemeint sind die URL-codierten Zeichenfolgen %2F beziehungsweise %5F. Wenn AllowEncodedSlashes nicht ausdrücklich auf On gesetzt wird, werden Anfragen nach solchen URLs mit dem Statuscode 404 Not Found beantwortet, andernfalls können CGI-Skripte möglicherweise etwas Sinnvolles damit anfangen - genau wie mit PathInfo.