\item\code{301}$\Rightarrow$ Moved Permanently \newline
\phantom{\code{301}}$\Rightarrow$\zB bei Domainnamensänderung, Neuordnung der Website
\item\code{302}$\Rightarrow$ Moved Temporarily \newline
\phantom{\code{302}}$\Rightarrow$\zB bei Überlastung der Website, Wartungsmodus, temporärer Ausfall
\end{itemize}
\item\textbf{\code{4xx}}: Client Request Errors
\begin{itemize}[noitemsep]
\item\code{400}$\Rightarrow$ Bad Request $\Rightarrow$ Der Request war nicht korrekt.
\item\code{401}$\Rightarrow$ Authorization Required $\Rightarrow$ Eine Autorisierung ist erforderlich.
\item\code{403}$\Rightarrow$ Forbidden $\Rightarrow$ Der Webserver hat \zB keinen Zugriff (auf ein Verzeichnis). Oder man greift auf ein Verzeichnis zu, ohne eine Datei anzugeben (und es gibt keine \pfad{index.html} und das Verzeichnislisting ist deaktiviert). \enquote{Wenn ich eine solche Meldung erhalte, erhält sie jeder!}
\item\code{404}$\Rightarrow$ Not Found; Der Pfad wurde nicht gefunden
\end{itemize}
\item\textbf{\code{5xx}}: Server Error
\begin{itemize}[noitemsep]
\item\code{500}$\Rightarrow$ Internal Server Error
\item\code{505}$\Rightarrow$ HTTP Version Not Supported $\Rightarrow$ Der Server wird mit einer Version angesprochen, die er nicht unterstützt. Heute eher selten.
\end{itemize}
\end{itemize}
\subsection{HTTP Header}
Die Statuszeile wird gefolgt von einer oder mehreren \acs{HTTP}-Header-Zeilen im Format: \newline
\code{<HTTP-Headername>: <Wert>}, \zB
\begin{description}[noitemsep]
\item[\code{Content-Type: text/html}] Der Wert ist ein \acf{MIME-Type}
\item\textbf{Achtung}: Alle \acsp{MIME-Type} sind standardisierte Werte! Dies ist standardisiert von \enquote{IANA} (Teil der \enquote{IETF} ) \newline
\textbf{Ausnahme}: \acs{slmt} beginnt mit \enquote{\code{x-}}, \zB\code{application/x-meinespezielleirgendwas}
\item Wird immer mitgegeben, außer man hat \textit{keinen} Content
(\zB bei \code{204} [siehe S.~\pageref{sec:http}])!
\end{itemize}
\item[\code{Content-Length:<Größe in Bytes>}] Größe der Antwort in Bytes
\begin{itemize}[noitemsep]
\item Wichtig für Anzeige von Download-Fortschrittsbalken
\item[\code{Expires: <US Datum>}] ebenfalls wichtig für Caches und Proxies
\item[\code{Content-Language:<Sprache des Inhalts>}] Menschliche Sprache des Inhalts. Kann auch bei Bildern angegeben werden, wenn dort \zB Text drauf steht.
\begin{itemize}[noitemsep]
\item 2-Letter-ISO-Language-Code ggf. mit Sprachvariante, \zB\code{de/DE-AT}, \code{fr}
\end{itemize}
\end{description}
Eine Leerzeile beendet die \acs{HTTP}-Header-Zeilen, danach folgt das Dokument. Die Leerzeile enthält \textbf{keine} Zeichen, auch keine Leerzeichen!
Mit HTTP 1.0 wurden weitere Request Typen eingeführt.
\subsubsection{HEAD-Request}
\code{HEAD /pfad/zur/ressource HTTP/1.0}$\Rightarrow$ liefert nur die Statuszeile und \acs{HTTP}-Headerzeile.
\subsubsection{POST-Request}
\code{POST /pfad/zur/ressource HTTP/1.0}$\Rightarrow$ gefolgt von Parametern (signalisiert wie bei einer Response über \acs{HTTP}-Headerzeilen).
\subsection{Was funktioniert nicht?}
\acs{HTTP} 1.0 funktioniert gut, aber was funktioniert nicht bzw. was geht besser?
Ist es möglich, mehrere \acs{FQDN} auf eine IP-Adrese zu leiten? \newline
\hspace*{4mm}$\Rightarrow$ FQDN1 und FQDN2 zeigen beide auf \code{1.2.3.4}; per \acs{DNS} möglich und erlaubt! \newline
\code{GET /pfad/zur/ressource HTTP/1.0}$\Rightarrow$ Problem: Der \acs{FQDN} steht nicht im Request bei \acs{HTTP} 1.0 und wird nicht einmal für den \acs{TCP}-Verbindungsaufbau verwendet $\Rightarrow$ Der Webserver weiss nicht, welche Präsenz angefragt ist!
\begin{Achtung}
\acs{HTTP} 1.0 kann nicht erkennen, von welchem \acs{FQDN} der Request kommt! Siehe \autoref{sec:multi_präsenzen} für Möglichkeiten, dennoch verschiedene Webpräsenzen zu unterscheiden.
Jetzt gibt es persistene Verbindungen, \dash eine \acs{TCP}-Verbindung wird nacheinander für meherere Request/Response-Paare zwischen Client und Server genutzt. \newline
$\Rightarrow$ Es muss nicht jeweils eine neue Verbindung aufgebaut werden. Bereits vorher bei \acs{HTTP} 1.0 gab es ähnliches, nämlich den \enquote{Connection: Keepalive}-Header. Dieser ist nicht standard-konform und nur teilweise implementiert!
\item Multiplexen mehrerer \acs{HTTP}-Requests über eine \acs{TCP}-Verbindung per \enquote{Stream-ID} ist möglich
\item Komprimierung (auch) der \acs{HTTP}-Header möglich.
\item\enquote{Server-Push}\footnote{\url{https://en.wikipedia.org/wiki/HTTP/2_Server_Push}}, \dash ein Webserver kann nach dem Request auf eine Ressource weitere damit in Zusammenhang stehende Ressourcen mitschicken, ohne dass diese explizit vom Client angefordert wurden.
\end{itemize}
\newpage
\section[Mehrere Web-Präsenzen auf einem Server]{Bereitstellung/Unterscheidung von mehreren Web-Präsenzen auf einem (großen) Webserver}\label{sec:multi_präsenzen}
\begin{enumerate}[noitemsep]
\item über den Pfad/das Verzeichnis
\begin{itemize}[noitemsep]
\item\code{http://www.uni.de/$\sim$<nachname>/}\index{Sonderzeichen!Tilde in URL}$\Rightarrow$ Mit Tilde: Unterverzeichnis im Home-Verzeichnis. Nicht für professionelle Web-Angebote geeignet.
\end{itemize}
\item über verschiedene Portnummern $\Rightarrow$ auch nicht professionell
\begin{itemize}[noitemsep]
\item\code{http://www.uni.de:4711/}
\item\code{http://www.uni.de:0815/}
\end{itemize}
\item per \acf{FQDN}\index{FQDN}\enquote{Rechner} oder \enquote{Domain}-Name, welche per DNS auf eine IP-Adresse umgesetzt werden (A-Record oder Alias-Eintrag), \newline
\zB\code{http://dhbw-karlsruhe.de}, \code{http://www.uni-karlsruhe.de}$\Rightarrow$ Dies gilt als professionell
\begin{enumerate}[noitemsep]
\item mehrere IP-Adressen (je eine eigene IP Adresse pro \acs{FQDN})
\begin{enumerate}[noitemsep]
\item mehrere Netzwerkkarten
\begin{itemize}[noitemsep]
\item\- teuer (Hardware)
\item\- Anzahl Steckplätze für Netzwerkkarten
\end{itemize}
\item mehrere IP Adressen für eine Netzwerkkarte ($\Rightarrow$ bei allen halbwegs modernen Betriebssystemen möglich, bei unixoiden Betriebssystemen \enquote{schon immer}, bei Windows seit WindowsNT [nicht bei Windows 3.1])
\begin{itemize}[noitemsep]
\item Reichen die IP-Adressen aus?
\item Wie viele IP-Adressen gibt es?
\item Siehe \autoref{sec:ipv4_adressen} auf Seite~\pageref{sec:ipv4_adressen}