1. Index
  2. HTML
  3. LaTeX
  4. Hardware
  5. Legende

Hypertext Transfer Protocol

HTTP ist ein zustandsfreies Anwendungsprotokoll für verteilte Informationssysteme.

Beispiel

Firefox ruft die Startseite von Google auf.

GET / HTTP/1.1
Host:             www.google.com
User-Agent:       Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2) …
Accept:           text/html,application/xhtml+xml,*/*;q=0.8
Accept-Language:  de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding:  gzip,deflate
Accept-Charset:   ISO-8859-1,UTF-8;q=0.7,*;q=0.7
Keep-Alive:       115
Connection:       keep-alive
Cookie:           NID=32=…

Googles Apache Webserver antwortet mit einer Erfolgsmeldung.

HTTP/1.1 200 OK
Date:             Wed, 17 Mar 2010 13:11:53 GMT
Server:           Apache
Expires:          -1
Cache-Control:    private, max-age=0
Content-Type:     text/html; charset=UTF-8
Content-Encoding: gzip
Content-Length:   4520
X-XSS-Protection: 0

Methoden

HTTP CRUD SQL Beschreibung
OPTIONS Nenne mir die Methoden einer Ressource im Allow-Header
POST CREATE INSERT Erzeuge eine neue Ressource, ich erwarte eine 201
Gib mir nur die Kopfzeilen
GET READ SELECT Liefere eine Ressource, siehe Accept-*
PUT UPDATE UPDATE Ändere eine Ressource, siehe Content-*
DELETE DELETE DELETE Lösche eine Ressource

Anfrage des Clients

Header Beispiel Beschreibung
Date Tue, 15 Nov 1994 Sendezeit
Accept */* Unterstützte MIME-Typen
Accept-Charset * Unterstützte Zeichenkodierungen
Accept-Encoding gzip Unterstützte Kompressionsverfahren
Accept-Language de Landessprache des Anwenders
Authorization Basic … Kredentialien für WWW-Authenticate
Cache-Control max-age=3600 Direktiven für Caching
Connection keep-alive Verbindung offen halten
Cookie Version=1; … Cookie-Daten, siehe Set-Cookie
Content-Length 348 Länge der Nachricht in Oktetten
Content-Type text/plain MIME-Typ der Nachricht
Expect 100-continue Erwartete Antwort
From user@example.net Adresse meines Anwenders
Host example.com Hostname (für namensbasierte virtuelle Hosts)
If-Match etag Führe die Anfrage nur aus, wenn du die gleiche Version der Ressource hast
If-None-Match etag Führe die Anfrage nur aus, wenn du eine andere Version der Ressource hast
If-Range etag Ändere diesen Bereich, wenn die Ressource nicht geändert wurde
If-Modified-Since Sat, 29 Oct 1994 Daten nur senden, wenn die Ressource seitdem geändert wurde
If-Unmodified-SinceSat, 29 Oct 1994 Daten nur senden, wenn die Ressource nicht geändert wurde
Keep-Alive no Verbindung für weitere Anfragen offen halten
Max-Forwards 10 Maximaltiefe für Caches und Proxies
Pragma no-cache Implementierungsabhängige Direktiven
Proxy-AuthorizationBasic … Kredentialien für Proxy-Authenticate
Range bytes=0-499 Untermenge der Ressource anfordern
Referer http://example.org Rückverweis
TE trailers Unterstützte Transfer-Encodings
Upgrade HTTP/2.0 Wechsel auf ein anderes Protokoll
User-Agent Mozilla/5.0 Identifikation des Browsers
Warning 199 Miscellaneous Hinweis auf potentielle Probleme mit den geseneten Daten

Antwort des Servers

Header Beispiel Beschreibung
Date Tue, 15 Nov 1994 Wann ich glaube die Antwort zu senden
Last-Modified Tue, 15 Nov 1994 Die Ressource wurde zuletzt geändert zu diesem Zeitpunkt
Expires Thu, 01 Dec 1994 Die Antwort gilt nur bis zu diesem Zeitpunkt
Server Apache/1.3.27 … So lautet meine Identifikation
Accept-Ranges bytes Ich unterstütze diese Formate für Teilbereiche
Allow HEAD,GET Die Ressource unterstützt nur diese Methoden, sonst 405
Content-Length 500 Ich sende Daten mit so vielen Oktetten
Content-Range bytes 0-99/248 Beginn und Ende eines Teilbereichs für Range
Content-Type text/html Die Daten sind mit diesem MIME-Typ und Zeichensatz kodiert. Siehe Accept
Content-Language de Die Daten sind in dieser Sprache verfasst. Siehe Accept-Language
Content-MD5 Q2h…5IQ== Die Base64-kodierte MD5-Summe der Daten
Content-Location /index.html Du findest die Ressource auch dort
Content-Encoding gzip Ich komprimiere die Daten mit diesme Verfahren. Siehe Accept-Encoding
Transfer-Encoding chunked Ich sende Daten mit dieser Kodierung
ETag W/"etag" So identifiziert sich diese Version der Ressource
Link </feed>; rel=meta Die Daten beziehen sich auf eine andere Ressource
Location http://example.org Sieh mal unter dieser URL nach
P3P CP="…" ?
Pragma no-cache Implementierungsabhängige Direktiven
Refresh 5; url="http://…" Öffne nach einer Wartezeit diese URL
Retry-After 120 Versuche es nach einer Wartezeit noch einmal
Set-Cookie …; Version=1 Sende mit bitte immer dieses Cookie
Trailer Content-MD5 Diese Header kommen erst im Trailer
Vary * Hinweis für Proxies
Warning 199 Misc Die gesendeten Daten könnten fehlerhaft sein
WWW-Authenticate Basic Weise dich bitte mit Authorization aus, sonst 401

Status-Codes

Status Beschreibung
Informational
100 Continue Du kannst jetzt die Daten aus der Expect-Anfrage senden
101 Switching Protocols Ich bin auf das Protokoll aus der Upgrade-Anfrage gewechselt
Successful
200 OK Alles klar, ich sende die angeforderte Daten
201 Created Ich habe die Ressource erzeugt und sende dir die URI im Location-Header
202 Accepted Ich bearbeite die Anfrage. Den aktuellen Status findest du im Nachrichtentext
203 Non-Authoritative Information Ich bin zwar nur ein Proxy, aber ich denke, alles ist gut
204 No Content Ich sende keinen Nachrichtentext
205 Reset Content Ich habe die Anfrage bearbeitet, setze bitte jedwedes Formular zurück
206 Partial Content Die Range-Anfrage war okay, ich sende den in Content-Range angegebenen Ausschnitt
Redirection
300 Multiple Choices Ich hätte mehrere Vorschläge, die primäre URI findest du im Location-Header, weitere URIs im Nachrichtentext
301 Moved Permanently Die Ressource ist umgezogen, wohin siehe Location-Header oder folge dem Hyperlink im Nachrichtentext
302 Found Ich habe die Ressource woanders gefunden, die URI steht im Location-Header und als Hyperlink im Nachrichtentext
303 See Other Ich leite dich (nach einem POST) weiter, siehe Location-Header und Hyperlink im Nachrichtentext
304 Not Modified Die Ressource hat sich gegenüber der Version aus dem If-*-Header nicht verändert, ich sende keinen Nachrichtentext
305 Use Proxy Verwende bitte einen Proxy, welchen siehe Location-Header
306 Reserved
307 Temporary Redirect Vorübergehende Weiterleitung, siehe Location-Header
Client Error
400 Bad Request Ich habe die Anfrage nicht verstanden
401 Unauthorized Du musst Dich erst ausweisen, wiederhole die Anfrage
mit einem WWW-Authenticate-Header
402 Payment Required Reserviert für Bezahldienste
403 Forbidden Das darfst Du nicht, die Begründung steht in der Antwort
404 Not Found Ich kenne die angefragte Ressource nicht
405 Method Not Allowed Die Ressource erlaubt dir die Methode nicht, schau im Allow-Header nach
406 Not Acceptable Ich unterstütze keinen der von dir im Accept-*-Header genannten MIME-Typen
407 Proxy Authentication Required Du musst dich gegenüber dem Proxy ausweisen,
wiederhole die Anfrage mit Proxy-Authenticate-Header
408 Request Timeout Ich konnte die Anfrage nicht in angemessener Zeit bearbeiten
409 Conflict Ich konnte die Ressource nach PUT nicht rekonstruieren
410 Gone Die Ressource wurde gelöscht
411 Length Required Wiederhole die Anfrage mit einem Content-Length-Header
412 Precondition Failed Erwartung aus Expect nicht erfüllt, sende bitte keine Daten
413 Request Entity Too Large Die Content-Length kann ich nicht verarbeiten
414 Request-URI Too Long Die URL mir uns zu lang
415 Unsupported Media Type Den Content-Type unterstütze ich nicht
416 Requested Range Not Satisfiable Der Ausschnitt aus deiner If-Range-Anfrage passt nicht, siehe Content-Range
417 Expectation Failed Ich erfülle die Erwartung aus der Expect-Anfrage nicht
451 Unavailable For Legal Reasons Übermittlung aufgrund einer juristischen Aufforderung Dritter unterdrückt. (Zensur)
Server Error
500 Internal Server Error Ich bin defekt
501 Not Implemented Die Ressource unterstützt die angefragte Methode nicht
502 Bad Gateway Der Server (oder nächsthöhere Proxy) meldet einen Fehler
503 Service Unavailable Wiederhole die Anfrage bitte nach Retry-After Sekunden
504 Gateway Timeout Der Server (oder nächsthöhere Proxy) antwortet mir nicht
505 HTTP Version Not Supported Ich unterstütze diese Protokollversion nicht, siehe Begründung im Nachrichtentext

CGI-Variablen

Das Common Gateway Interface bietet eine einfache Schnittstelle, um serverseitig dynamische Webseiten zu erzeugen. Der Webserver nimmt Anfragen entgegen und ruft anhand der URL, ein Programm auf, welches auf der Standardausgabe die gewünschten Daten liefert. Alle nötigen Informationen werden als Umgebungsvariablen übergeben.

Variable Quelle Beispiel Beschreibung
Anfrage
REQUEST_METHOD Anfrage GET Methode in der Anfrage
REQUEST_URI Anfrage /myapp/do.pl/some/path?foo=bar URL in der Anfrage (ohne Hostname)
SCRIPT_NAME Anfrage /myapp/do.pl Pfad bis einschließlich des Skriptnamens
SCRIPT_FILENAME Config /var/lib/cgi-bin/do.pl Lokaler Pfad zum Skript
PATH_INFO Anfrage /some/path Pfad zwischen Skriptname und Query
PATH_TRANSLATED Anfrage /var/www/some/path Pfad im Dateisystem
QUERY_STRING Anfrage foo=bar Zeichenkette nach dem ?
Client
HTTP_REFERER Header http://localhost/index.html URL der verweisenden Seite
HTTP_USER_AGENT Header Mozilla Identifikation des Browsers
HTTP_ACCEPT Header text/html,*.*;q=0.8 Bekannte MIME-Typen
HTTP_ACCEPT_CHARSETHeader utf-8,*;q=0.8 Bekannte Zeichensätze
HTTP_ACCEPT_ENCODINGHeader gzip,deflate Bekannte Kodierungen
REMOTE_ADDR Netzwerk 127.0.0.1 Adresse des Clients
REMOTE_PORT Netzwerk 1234 Portnummer des Clients
REMOTE_HOST Netzwerk localhost Hostname des Clients, wenn eine DNS-Abfrage aktiv ist
REMOTE_IDENT Netzwerk example Identifikation des Clients, wenn dort ein Ident-Daemon läuft
REMOTE_USER Header phrank Benutzernamen für Authorisierung
Server
SERVER_ADDR Netzwerk 127.0.0.1 Adresse des Servers
SERVER_PORT Netzwerk 80 Portnummer des Daemons
SERVER_NAME Config www.example.com Hostname des Servers
SERVER_ADMIN Config webmaster@example.com Adresse des Administrators
SERVER_SIGNATURE Config Identifikation des Servers
SERVER_SOFTWARE Config Apache/1.3.27 Name und Version des Daemons
SERVER_PROTOCOL Anfrage HTTP/1.1 Protokoll und Version
GATEWAY_INTERFACE Config CGI/1.1 CGI-Version

Literatur