
\chapter{URLs und URIs}\label{sec:url_uri}\index{URL}
\acfp{URL} sind eine Teilmenge der \acfp{URI}.

\begin{description}
    \item[\acs{URL}] Die Adresse einer Ressource (mit allen relevanten Informationen). \newline
        Beispiel für URL (und damit auch für URI): \pfad{http://www.dhbw-karlsruhe.de/}

    \item[\acs{URI}] Gibt Informationen, wie eine Ressource erreicht werden kann. \newline
        Beispiel für URI (aber nicht für eine URL): mailto:xyz@dhbw-karlsruhe.de
\end{description}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


\section{\acl{URI} (URI)}\index{URI}
Allgemeines Format einer URI: \code{schema:info}

Beispiele für \code{schema}:

\begin{itemize}[noitemsep]
  \item \code{mailto} Info ist die E-Mail Adresse
  \item \code{news} Info ist die Newsgroup (und evtl. Artikel-ID)
  \item \code{http} Info ist Rest der Adresse
\end{itemize}

Falls \code{schema} = Anwendungsprotokoll $\Rightarrow$ URI ist eine URL.

\section{\acl{URL} (URL)}

Format einer \acs{URL}:\newline
\code{protocol://[uid[:pw]@]host[:port]/[directory/][resource][?parameter][\#anchor]}

\begin{description}
    \item[\code{protocol}] Das Anwendungsprotokoll der Anwendung, \zB http, https, ftp)
    \item[\code{uid}] User-ID, Benutzername (für zugriffsbeschränkte Ressourcen)
    \item[\code{pw}] Passwort (in Browsern aus Sicherheitsgründen meist nicht implementiert)
    \item[\code{host}] Name (\acs{FQDN}) oder IP-Adresse des Webservers.
    \item[\code{port}] Portnummer (positive ganze Zahl).\newline
            Falls nicht angegeben, so ist der Default-Port abhängig vom verwendeten
            Protokoll (\zB HTTP auf Port 80, HTTPS auf Port 443)
    \item[\code{/}] Der abschließende Schrägstrich (könnte auch als Pfad zur Ressource interpretiert werden).

    \item[directory] Verzeichnis. Falls nicht angegeben $\Rightarrow$ Wurzelverzeichnis (\enquote{root directory}).

    \item[resource] Name der Ressource im jeweiligen Verzeichnis (meist bestehend aus Name und File-Extension). Falls nichts angegeben wird, so entscheidet der Webserver über die auszuliefernde Ressource (\zB eine Default-Datei \pfad{index.html}, eine Verzeichnisauflistung oder eine Fehlermeldung).

    \item[\code{parameter}] Liste von \code{GET}-Parametern in der Form\newline \code{parametername=parameterwert[\&paraname2=parawert2[\&\ldots]]} (potentiell beliebig viele Parameter, beschränkt durch max. Länge aus URL\footnote{siehe \url{http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers}}).

    \item[\code{anchor}] Anker: Textstelle, zu welcher der Browser direkt springt.\newline

\end{description}

\begin{Achtung}
    Der Anker (\code{\#xyz}) wird beim Request nicht an den Server mitgeschickt! \code{anchor} wird lokal im Browser ausgewertet, \zB durch JavaScript. PHP, welches serverseitig arbeitet, kann dies nicht auswerten.
\end{Achtung}

\subsection{Relative URLs}\label{sec:relative_url}
Es können auch relative \acsp{URL} angegeben werden, die jedoch mithilfe der vollständigen \acs{URL} des enthaltenden Dokuments ebenfalls zu einer vollständigen (absoluten) URL gemacht werden! Es wird zwischen folgenden relativen URLs unterschieden:

\begin{description}
    \item[Protokoll-relative URL] beginnt mit \pfad{//...}, \pfad{host/...} (\zB HTTPS)\index{URL!Protokoll-relativ}
    \item[Host-relative] (Pfad-absolute) URL: beginnt mit \pfad{/pfad...} (\zB Verweis auf zentrale Dokumente auf demselben Server wie das Impressum oder die Einstiegsseite)\index{URL!Host-relativ}\index{URL!Pfad-absolut}
    \item[Pfad-relative URL] beginnt mit \pfad{pfad} (ohne Schrägstrich am Anfang; Verweis auf logisch zusammenhängende Ressourcen im selben Verzeichnis oder Unter-/Oberverzeichnis)\index{URL!Pfad-relativ}
\end{description}

Vorteile von relativen URLs:
\begin{itemize}[noitemsep]
  \item (meist) kürzer
  \item \enquote{Umzugsfähigkeit} der Web-Präsenz\ldots
      \begin{itemize}[noitemsep]
        \item \ldots auf einen anderen Server (Host-relativ)
        \item \ldots in ein anderes Verzeichnis (Pfad-relativ)
      \end{itemize}
\end{itemize}

Anwendung von vollständigen (Host-absoluten) URLs
\begin{itemize}[noitemsep]
  \item Verweis auf eine andere Web-Präsenz
  \item Verweis auf den eigenen Server mit anderem Protokoll (HTTP $\Leftrightarrow$ HTTPS $\Leftrightarrow$ FTP)
\end{itemize}

Spezielle Verzeichnisnamen, welche speziell bei relativen URLs wichtig sind:

\begin{description}[noitemsep]
  \item[\pfad{..}] das übergeordnete Verzeichnis (im Falle des Wurzelverzeichnisses wiederum das Wurzelverzeichnis).
  \item[\pfad{.}] das aktuelle Verzeichnis
\end{description}


\textbf{Beispiel}: URL des Dokuments \pfad{http://a.b/c/d/e/f.bla}

\begin{tabular}{lll}
  URL in \html{<a href="...">} & ergibt & \\
  \pfad{//a.b/z/x}  & $\Rightarrow$ \pfad{http://a.b/z/x} & \\
  \pfad{/}          & $\Rightarrow$ \pfad{http://a.b/}  & Einstiegsseite des Servers \\
  \pfad{./}         & $\Rightarrow$ \pfad{http://a.b/c/d/e/} & Default-Dokument im aktuellen Verzeichnis \\
  \pfad{../.././../bla/fasel/././../da} & $\Rightarrow$ \pfad{http://a.b/bla/da} &
\end{tabular}


\subsection{Anker}

\html{<a>} für Textanker im Dokument (auf die mit \pfad{\#ankername} gesprungen werden kann).

\html{<a name="ankername">Hierhin kann ich springen</a>} (ursprüngliche Variante) bzw.

\html{<a id="ankername">Hierhin auch</a>} (neuere/spätere Variante)

\begin{Hinweis}
    \code{id} ist ein \enquote{Universalattribut} und kann mit (fast) jedem Tag verwendet werden.
    Der Tag wird dann über \pfad{\#ankername} ebenfalls direkt anspringbar!

    $\Rightarrow$ Das \html{<a>}-Tag ist für Verwendung als Textanker heute nicht mehr notwendig! Es reicht die ID \zB eines \html{<h1>}-Tags.
\end{Hinweis}
