Zum Inhalt springen

„Simple Common Gateway Interface“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Sprachanbindung: https://github.com/adamdruppe/misc-stuff-including-D-programming-language-web-stuff
 
(26 dazwischenliegende Versionen von 23 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Das '''Simple Common Gateway Interface''' ('''SCGI''') ist ein Standard für den Datenaustausch zwischen einem [[Webserver]] und dritter Software, die Anfragen bearbeitet. Es ist eine Alternative zu klassischem [[Common Gateway Interface|CGI]] und ähnelt dem [[FastCGI]]-Protokoll.
Das '''Simple Common Gateway Interface''' ('''SCGI''') ist ein textbasiertes [[Netzwerkprotokoll]] für die Anbindung eines [[Anwendungsserver]]s an einen [[Webserver]]. Es ist eine Alternative zu [[Hypertext Transfer Protocol|HTTP]] und dem klassischen [[Common Gateway Interface|CGI]] und ähnelt dem [[FastCGI]]-Protokoll.


Die Spezifikation wurde von Neil Schemenauer erstellt und am 12. Januar 2006 als gemeinfreie Spezifikation veröffentlicht. Im Vergleich zu FastCGI ist das SCGI-Protokoll einfacher zu implementieren; moderne Webserver bieten mittlerweile gleichermaßen Unterstützung für FastCGI und SCGI an.
Die Spezifikation wurde von Neil Schemenauer erstellt und am 12. Januar 2006 als gemeinfreie Spezifikation veröffentlicht. Im Vergleich zu FastCGI ist das SCGI-Protokoll einfacher zu implementieren; moderne Webserver bieten mittlerweile gleichermaßen Unterstützung für FastCGI und SCGI an.


== Protokollbeschreibung ==
== Protokollbeschreibung ==
Jeder SCGI-Request ([[Englische Sprache|engl.]] Anfrage) besteht aus einer Liste von Headern (Beschreibung des Inhalts) und einem Body (Inhalt). Die Header werden als Netstring kodiert und anschließend gefolgt vom Body über eine eigene Verbindung zur SCGI-Anwendung verschickt. Die Verbindung bleibt dabei bestehen und wird erst, nachdem die SCGI-Anwendung eine Antwort geschickt hat, beendet.
Der Webserver öffnet für jede Anfrage eine eigene Verbindung zur SCGI-Applikation und beginnt mit dem Versenden eines Parameterblocks. Der Parameterblock ist als Netstring kodiert (Netstrings beginnen mit einer ASCII-dezimalen Längenangabe, gefolgt von einem ASCII-Doppelpunkt, der eigentlichen Payload mit beliebigen Bytes und einem ASCII-Komma als Abschluss). Im Parameterblock werden Paare aus Name und Wert, jeweils mit <00>-Nullbyte getrennt, gesendet, die den Umgebungsvariablen des CGI-Protokolls entsprechen. In der Parameterliste sollte ein Parameter SCGI mit Wert 1 auftreten und es muss ein Parameter CONTENT_LENGTH auftreten, der die Länge der Daten nach dem Parameterblock beschreibt.


Durch die Kodierung der Header als Netstring beginnt jeder SCGI-Request mit einer Ziffer. Da dieser deshalb mit einem ASCII Byte zwischen '1' und '9' beginnt, kann dieser von einem HTTP-Forward unterschieden werden – eine laufende SCGI-Applikation kann so leicht in die Lage versetzt werden, gleichermaßen SCGI-Requests und HTTP GET/POST-Anfragen zu behandeln.
Nach Dekodieren der Anfrage sendet die SCGI-Applikation auf der geöffneten Verbindung die Antwort, die in der Praxis wie bei CGI üblich mit dem Status-Parameter beginnt; allerdings definiert das Protokoll selbst kein Format für die Antwort <ref>[http://python.ca/scgi/protocol.txt SCGI-Spezifikation, § 2]</ref>. Nach Versenden der CGI-Antwort wird die Verbindung von der SCGI-Applikation beendet.


Für die Antwort ist im Protokoll kein Format definiert.<ref>[http://python.ca/scgi/protocol.txt SCGI-Spezifikation, § 2]</ref> Es ist allerdings wie bei CGI üblich, dass die Antwort mit dem Status-Parameter beginnt.
Da eine SCGI-Verbindung mit einem ASCII '1' bis '9'-Byte beginnt, kann eine SCGI-kodierte Anfrage von einem HTTP-Forward unterschieden werden – eine laufende SCGI-Applikation kann so leicht in die Lage versetzt werden, gleichermaßen SCGI-Anfragen und HTTP GET/POST-Anfragen zu behandeln.

=== Header ===
{| class="wikitable"
|-
| <Key> || <NUL> || <Value> || <NUL>
|}

Wie oben dargestellt besteht jeder Header aus einem Key-Value-Pair ([[Englische Sprache|engl.]] Schlüssel-Wert-Paar). Dabei wird der Schlüssel mit einem ASCII-Null (NUL) vom Wert getrennt, sowie der Header mit einem ASCII-Null (NUL) abgeschlossen. Jeder Schlüssel muss eindeutig sein und darf folglich nur einmal vorkommen.

=== SCGI-Request ===
{| class="wikitable"
|-
| <Länge des Netstrings>: || "CONTENT_LENGTH" || <NUL> || <Länge des Body> || <NUL> || "SCGI" || <NUL> || 1 || <NUL> || ... || "," ||<Body>
|}

Der erste Header muss den Schlüssel "CONTENT_LENGTH" haben und darf keinen leeren Wert haben, selbst wenn die Länge des Body 0 beträgt. Danach folgen alle übrigen Header, die aber optional sind mit Ausnahme eines mit Schlüssel "SCGI" und Wert 1.


== Webserverunterstützung ==
== Webserverunterstützung ==
Zeile 15: Zeile 31:
* [[Apache HTTP Server]]
* [[Apache HTTP Server]]
* [[Lighttpd]]
* [[Lighttpd]]
* [[Cherokee HTTP Server]]
* [[Nginx|Nginx Server]]
* [[Nginx|Nginx Server]]
* Althttpd<ref>{{Internetquelle |url=https://sqlite.org/althttpd/doc/trunk/althttpd.md |titel=Althttpd: The Althttpd Webserver |abruf=2023-05-19}}</ref>


== [[Sprachanbindung]] ==
== Sprachanbindung ==
Folgende Programmiersprachen unterstützen die Erstellung von SCGI-Applikationen.
Folgende Programmiersprachen unterstützen die Erstellung von SCGI-Applikationen per [[Sprachanbindung]]:
* [[D_(Programmiersprache)|D]]
* [[D (Programmiersprache)|D]]
* [[Ruby_(Programmiersprache)|Ruby]]
* [[Ruby (Programmiersprache)|Ruby]]
* [[Python (Programmiersprache)|Python]]
* [[Python (Programmiersprache)|Python]]
* [[Lisp|Lisp]]
* [[Lisp]]
* [[Perl (Programmiersprache)|Perl]]
* [[Perl (Programmiersprache)|Perl]]
* [[Haskell (Programmiersprache)|Haskell]]
* [[Haskell (Programmiersprache)|Haskell]]
* [[Java (Programmiersprache)|Java]]
* [[Java (Programmiersprache)|Java]]
* [[PHP]]
* [[PHP]]
* [[Tcl]]


== Einzelnachweise ==
== Einzelnachweise ==
Zeile 37: Zeile 54:
* [http://python.ca/scgi/ Apache SCGI-Module und Python SCGI-Interface]
* [http://python.ca/scgi/ Apache SCGI-Module und Python SCGI-Interface]
* [http://www.cherokee-project.com/bugs/browser/cherokee/trunk/cherokee/handler_scgi.c Cherokee SCGI-Modul]
* [http://www.cherokee-project.com/bugs/browser/cherokee/trunk/cherokee/handler_scgi.c Cherokee SCGI-Modul]
* [http://search.cpan.org/~vipercode/SCGI/lib/SCGI.pm Perl SCGI-Interface]
* [http://metacpan.org/module/SCGI Perl SCGI-Interface]
* [http://snippets.dzone.com/posts/show/4304 Java SCGI Konnektor]
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/scgi Haskell SCGI Package]
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/scgi Haskell SCGI Package]
* [http://code.google.com/p/appserver-in-php/ PHP SCGI Libraries]
* [http://code.google.com/p/appserver-in-php/ PHP SCGI Libraries]
* [http://wiki.codemongers.com/NginxNgxSCGIModule Nginx SCGI-Modul]
* [http://wiki.codemongers.com/NginxNgxSCGIModule Nginx SCGI-Modul]
* [http://woof.sourceforge.net/woof-ug/_woof/docs/ug/start_scgi WOOF! Framework]


{{Navigationsleiste Webserver-Schnittstellen}}
[[Kategorie:World Wide Web]]


[[Kategorie:Webserver]]
[[en:Simple Common Gateway Interface]]
[[Kategorie:Netzwerkprotokoll auf Anwendungsschicht]]
[[es:Simple Common Gateway Interface]]
[[fr:Simple Common Gateway Interface]]
[[ru:SCGI]]

Aktuelle Version vom 17. Mai 2025, 02:38 Uhr

Das Simple Common Gateway Interface (SCGI) ist ein textbasiertes Netzwerkprotokoll für die Anbindung eines Anwendungsservers an einen Webserver. Es ist eine Alternative zu HTTP und dem klassischen CGI und ähnelt dem FastCGI-Protokoll.

Die Spezifikation wurde von Neil Schemenauer erstellt und am 12. Januar 2006 als gemeinfreie Spezifikation veröffentlicht. Im Vergleich zu FastCGI ist das SCGI-Protokoll einfacher zu implementieren; moderne Webserver bieten mittlerweile gleichermaßen Unterstützung für FastCGI und SCGI an.

Protokollbeschreibung

[Bearbeiten | Quelltext bearbeiten]

Jeder SCGI-Request (engl. Anfrage) besteht aus einer Liste von Headern (Beschreibung des Inhalts) und einem Body (Inhalt). Die Header werden als Netstring kodiert und anschließend gefolgt vom Body über eine eigene Verbindung zur SCGI-Anwendung verschickt. Die Verbindung bleibt dabei bestehen und wird erst, nachdem die SCGI-Anwendung eine Antwort geschickt hat, beendet.

Durch die Kodierung der Header als Netstring beginnt jeder SCGI-Request mit einer Ziffer. Da dieser deshalb mit einem ASCII Byte zwischen '1' und '9' beginnt, kann dieser von einem HTTP-Forward unterschieden werden – eine laufende SCGI-Applikation kann so leicht in die Lage versetzt werden, gleichermaßen SCGI-Requests und HTTP GET/POST-Anfragen zu behandeln.

Für die Antwort ist im Protokoll kein Format definiert.[1] Es ist allerdings wie bei CGI üblich, dass die Antwort mit dem Status-Parameter beginnt.

<Key> <NUL> <Value> <NUL>

Wie oben dargestellt besteht jeder Header aus einem Key-Value-Pair (engl. Schlüssel-Wert-Paar). Dabei wird der Schlüssel mit einem ASCII-Null (NUL) vom Wert getrennt, sowie der Header mit einem ASCII-Null (NUL) abgeschlossen. Jeder Schlüssel muss eindeutig sein und darf folglich nur einmal vorkommen.

<Länge des Netstrings>: "CONTENT_LENGTH" <NUL> <Länge des Body> <NUL> "SCGI" <NUL> 1 <NUL> ... "," <Body>

Der erste Header muss den Schlüssel "CONTENT_LENGTH" haben und darf keinen leeren Wert haben, selbst wenn die Länge des Body 0 beträgt. Danach folgen alle übrigen Header, die aber optional sind mit Ausnahme eines mit Schlüssel "SCGI" und Wert 1.

Webserverunterstützung

[Bearbeiten | Quelltext bearbeiten]

Folgende Webserver unterstützen das SCGI-Protokoll.

Sprachanbindung

[Bearbeiten | Quelltext bearbeiten]

Folgende Programmiersprachen unterstützen die Erstellung von SCGI-Applikationen per Sprachanbindung:

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. SCGI-Spezifikation, § 2
  2. Althttpd: The Althttpd Webserver. Abgerufen am 19. Mai 2023.