Hypertext Markup Language (HTML) ist eine Auszeichnungssprache zur Strukturierung elektronischer Dokumente. HTML-Dokumente werden von Webbrowsern dargestellt und bilden die Grundlage für Webseiten. HTML ist zusammen mit CSS und JavaScript eine der Kernsprachen des World Wide Webs (WWW).
<!DOCTYPE html> <html lang="de"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Hello World!</title> <!-- <link rel="icon" href="img/favicon.svg"> --> <!-- <link rel="stylesheet" href="css/style.css"> --> <!-- <script type="module" src="js/script.js"></script> --> <!-- <script defer nomodule src="js/script.fallback.js"></script> --> </head> <body> <p>Hello World!</p> </body> </html>
Dieses Template berücksichtig keine IE eigenarten, da dieser Browser nicht mehr supported wird!
veraltet, muss aktualisiert werden
Ein einfaches HTML-Dokument kann wie folgt aussehen:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-8">
<TITLE>Hallo</TITLE>
</HEAD>
<body LANG="de-DE">
Hallo Welt!
</body>
</HTML>
... <!-- einzeiliger Kommentar --> ... <!-- # und das ist ein mehrzeiliger Kommentar bla-bla-bla Letzte Zeile des Kommentars # --> ...
Ein CGI-Script (in Bourne SHell) sollte als allererstes die Zeile
echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">'
enthalten und erst dann seine eigentliche Arbeit tun! Sonst bekommt man den Fehler:
malformed header from script. Bad header=<!DOCTYPE HTML PUBLIC "-//W3C/
Wenn der Fehler
Syntax error: newline unexpected
auftritt hat man dummerweise vor der oben erwähnten ersten Zeile eine Leerzeile gesendet. Das kann z.B. auftreten wenn man die erste Zeile nicht so abschickt wie oben gezeigt sondern so:
echo ' <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> '
Will man eine Weiterleitung im HTML-Dokument bewirken, setzt man unter der vorhandenen META-Zeile noch eine zweite drunter, die wie folgt aussehen könnte:
<META HTTP-EQUIV="Refresh" CONTENT="5; URL=http://www.neuer-server.de">
In einzelnen Fällen (unter Verwendung anderer Betriebssysteme oder älterer Software) kann es sein, dass der UTF-8-Zeichensatz nicht zur Verfügung steht, dann verwendet man in der Regel ISO-8859-15. Zu beachten ist, dass der Zeichensatz ISO-8859-1 der alte US-Zeichensatz ist und deshalb keine Umlaute und kein Eurosymbol enthält.
charset=iso-8859-15
Um mit Umlauten in einem HTML-Dokument keine Probleme zu bekommen, sollte man die HTML-Kodierung für Sonderzeichen verwenden (Nicht zu verwechseln mit URI-Kodierung: https://www.urlencoder.io/):
| lfd. Nr. | Zeichen | HTML-Kodierung | Zeichen | HTML-Kodierung | Zeichen | HTML-Kodierung | ||
|---|---|---|---|---|---|---|---|---|
| 1 | ¡ | ¡ | À | À | à | à | ||
| 2 | ¢ | ¢ | Á | Á | á | á | ||
| 3 | £ | £ | Â | Â | â | â | ||
| 4 | ¤ | ¤ | Ã | Ã | ã | ã | ||
| 5 | ¥ | ¥ | Ä | Ä | ä | ä | ||
| 6 | ¦ | ¦ | Å | Å | å | å | ||
| 7 | § | § | Æ | Æ | æ | æ | ||
| 8 | ¨ | ¨ | Ç | Ç | ç | ç | ||
| 9 | © | © | È | È | è | è | ||
| 10 | ª | ª | É | É | é | é | ||
| 11 | « | « | Ê | Ê | ê | ê | ||
| 12 | ¬ | ¬ | Ë | Ë | ë | ë | ||
| 13 | ® | ® | Ì | Ì | ì | ì | ||
| 14 | ¯ | ¯ | Í | Í | í | í | ||
| 15 | ° | ° | Î | Î | î | î | ||
| 16 | ± | ± | Ï | Ï | ï | ï | ||
| 17 | ² | ² | Ð | Ð | ð | ð | ||
| 18 | ³ | ³ | Ñ | Ñ | ñ | ñ | ||
| 19 | ´ | ´ | Ò | Ò | ò | ò | ||
| 20 | µ | µ | Ó | Ó | ó | ó | ||
| 21 | ¶ | ¶ | Ô | Ô | ô | ô | ||
| 22 | · | · | Õ | Õ | õ | õ | ||
| 23 | ¸ | ¸ | Ö | Ö | ö | ö | ||
| 24 | ¹ | ¹ | × | × | ÷ | ÷ | ||
| 25 | º | º | Ø | Ø | ø | ø | ||
| 26 | » | » | Ù | Ù | ù | ù | ||
| 27 | ¼ | ¼ | Ú | Ú | ú | ú | ||
| 28 | ½ | ½ | Û | Û | û | û | ||
| 29 | ¾ | ¾ | Ü | Ü | ü | ü | ||
| 30 | ¿ | ¿ | Ý | Ý | ý | ý | ||
| 31 | Þ | Þ | þ | þ | ||||
| 32 | ß | ß | ÿ | ÿ |
Für die Nicht-Linux-Gemeinde (z.B.: FreeBSD) gibt hier ein wunderschönes Rust-Programm, mit dem sich auf der CLI die meisten Zeichen in HTML-Kode umwandeln lassen.
[root@webserver ~]# cd /usr/ports/lang/rust/ [root@erde /usr/ports/lang/rust]# make clean [root@erde /usr/ports/lang/rust]# make [root@erde /usr/ports/lang/rust]# make install [root@erde /usr/ports/lang/rust]# make clean > cargo install urlencode > ls -lha /benutzer/.cargo/bin/ > cp /benutzer/.cargo/bin/urlencode /usr/local/bin/ > echo Test\'s\ 1/Best\'s\ of\ \"Cap\".mp4 | urlencode Test's%201%2FBest's%20of%20%22Cap%22.mp4 > echo Test\'s\ 1/Best\'s\ of\ \"Cap\".mp4 | urlencode | sed "s/[']/%27/g")" Test%27s%201%2FBest%27s%20of%20%22Cap%22.mp4
<!doctype html>
<html>
<head>
<title>www.quelle.de</title>
<meta charset=utf-8">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="refresh" content="0;url=http://www.ziel.de/page/">
<meta name="identifier-url" content="http://www.ziel.de/page/">
<meta name="language" content="deutsch">
</head>
<body bgcolor=white>
<div align=center>
<font face="arial, helvetica">
Weiterleitung von "www.quelle.de" auf "www.ziel.de/page/"
</font>
<br><br>
<font size=-1>
dies ist nur eine Weiterleitung!
</font>
</div>
</body>
</html>
> vi /usr/lib/cgi-bin/webtest.cgi
#!/bin/bash
#==============================================================================#
### Variablen
VERSION="v2013090500"
ZEICHENSATZ="UTF-8"
#ZEICHENSATZ="ISO-8859-15"
HINTERGRUNDFARBE="#E0E0FF"
GRAU="#222222"
ROT="#EE0000"
STARTZEIT="$(date +'%F %T')"
#------------------------------------------------------------------------------#
### Beispiele für wichtige Umgebungsvariablen
#
# HTTP_HOST=192.168.0.10
# SCRIPT_FILENAME=/usr/lib/cgi-bin/webtest.cgi
# REQUEST_URI=/cgi-bin/webtest.cgi?GET-VARIABLE=Wert01
# SCRIPT_NAME=/cgi-bin/webtest.cgi
# HTTP_REFERER=http://192.168.0.10/cgi-bin/webtest.cgi
# REMOTE_ADDR=192.168.0.10
# SERVER_NAME=192.168.0.10
# CONTENT_LENGTH=22
# QUERY_STRING=GET-VARIABLE=Wert01
# SERVER_ADDR=192.168.0.10
#
#==============================================================================#
### Kopf / ANFANG
echo "Content-Type: text/html; charset=${ZEICHENSATZ}
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'
'http://www.w3.org/TR/html4/loose.dtd'>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=${ZEICHENSATZ}' />
<title>
HTML-Testseite Version ${VERSION}
</title>
<meta name='date' content='${STARTZEIT}' />
<meta name='keywords' content='webtest' />
</head>
<body bgcolor='${HINTERGRUNDFARBE}'>
"
#==============================================================================#
### Datenstrom aus dem POST-Kanal in eine Variable schreiben
POSTDATEN=$(cat | tr -d '\r')
#==============================================================================#
### SEITENINHALT
if [ -z "${POSTDATEN}" ] ; then
### wenn keine Daten per POST gekommen sind, dann wird dieser Teil angezeigt
if [ -z "${QUERY_STRING}" ] ; then
echo "
<h1><U>unterstrichene Überschrift</U></h1>
<pre>
Diese Text wird in Courier mit allen normalen Zeilenumbrüchen
und allen Leerzeichen angezeigt.
</pre>
<B>Diese Zeile ist FETT gedruckt.</B>
<hr>
<form method=post enctype=text/plain action='${SCRIPT_NAME}'>
<p>
<input type='checkbox' name='POST-VARIABLE' value='Wert01'>
<a href='http://${SERVER_NAME}${SCRIPT_NAME}?GET-VARIABLE=Wert01'>
<font color='${GRAU}'>
Wert01
</font>
</a>
<br>
<input type='checkbox' name='POST-VARIABLE' value='Wert02' checked>
<a href='http://${SERVER_NAME}${SCRIPT_NAME}?GET-VARIABLE=Wert02'>
<font color='${ROT}'>
Wert02
</font>
</a>
<br>
</p>
<input type=submit value= Absenden >
</form>
"
else
### wenn keine Daten per POST gekommen sind, dann wird dieser Teil angezeigt
echo "
<hr>
<a href='http://${SERVER_NAME}${SCRIPT_NAME}'>
http://${SERVER_NAME}${SCRIPT_NAME}
</a>
<hr>
<h1>übertragene Daten per GET</h1>
<pre>
${QUERY_STRING}
</pre>
"
fi
#------------------------------------------------------------------------------#
else
### wenn Daten per POST gekommen sind, dann werden hier die POST-Daten angezeigt
echo "
<hr>
<a href='http://${SERVER_NAME}${SCRIPT_NAME}'>
http://${SERVER_NAME}${SCRIPT_NAME}
</a>
<hr>
<h1>übertragene Daten per POST</h1>
<pre>
${POSTDATEN}
</pre>
"
fi
#==============================================================================#
### Fuss / ENDE
echo "
</body>
</html>
"
#==============================================================================#
HTML-Code beim ersten Aufruf (ohne POST-Daten):
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'
'http://www.w3.org/TR/html4/loose.dtd'>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
<title>
HTML-Testseite Version v2013090500
</title>
<meta name='date' content='2013-09-05 14:03:27' />
<meta name='keywords' content='webtest' />
</head>
<body bgcolor='#E0E0FF'>
<h1><U>unterstrichene Überschrift</U></h1>
<pre>
Diese Text wird in Courier mit allen normalen Zeilenumbrüchen
und allen Leerzeichen angezeigt.
</pre>
<B>Diese Zeile ist FETT gedruckt.</B>
<hr>
<form method=post enctype=text/plain action='/cgi-bin/webtest.cgi'>
<p>
<input type='checkbox' name='POST-VARIABLE' value='Wert01'>
<a href='http://192.168.0.10/cgi-bin/webtest.cgi?GET-VARIABLE=Wert01'>
<font color='#222222'>
Wert01
</font>
</a>
<br>
<input type='checkbox' name='POST-VARIABLE' value='Wert02' checked>
<a href='http://192.168.0.10/cgi-bin/webtest.cgi?GET-VARIABLE=Wert02'>
<font color='#EE0000'>
Wert02
</font>
</a>
<br>
</p>
<input type=submit value= Absenden >
</form>
</body>
</html>
HTML-Code nach dem der Knopf "Absenden" gedrückt wurde (mit POST-Daten):
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'
'http://www.w3.org/TR/html4/loose.dtd'>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
<title>
HTML-Testseite Version v2013090500
</title>
<meta name='date' content='2013-09-05 14:05:27' />
<meta name='keywords' content='webtest' />
</head>
<body bgcolor='#E0E0FF'>
<hr>
<a href='http://192.168.0.10/cgi-bin/webtest.cgi'>
http://192.168.0.10/cgi-bin/webtest.cgi
</a>
<hr>
<h1>übertragene Daten per POST</h1>
<pre>
POST-VARIABLE=Wert02
</pre>
</body>
</html>
HTML-Code nach dem der Link "Wert01" gedrückt wurde (mit GET-Daten):
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'
'http://www.w3.org/TR/html4/loose.dtd'>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
<title>
HTML-Testseite Version v2013090500
</title>
<meta name='date' content='2013-09-05 14:07:06' />
<meta name='keywords' content='webtest' />
</head>
<body bgcolor='#E0E0FF'>
<hr>
<a href='http://192.168.0.10/cgi-bin/webtest.cgi'>
http://192.168.0.10/cgi-bin/webtest.cgi
</a>
<hr>
<h1>übertragene Daten per GET</h1>
<pre>
GET-VARIABLE=Wert01
</pre>
</body>
</html>
Der Kode wurde hauptsächlich in HTML Version 4 mit ein paar CSS-Elementen verfasst.
<!DOCTYPE html> <html lang="de-DE"> <head> <meta charset="UTF-8"> <style type="text/css"> </style> <title> Klausur </title> </head> <body> <h1> Klausur </h1> <h2> Informatik </h2> <h3> E-Phase </h3> <h4> Raum 033 </h4> <h5> Freitag </h5> <h6> 7. - 8. Stunde </h6> <p> Frau Lehrerin </p> <br> <br> <table border="3" width="100%" height="300px" cellpadding="3" style="color: black"> <tr> <th> links </th> <th> mitte </th> <th> rechts </th> </tr> <tr> <td valign="top" align="left"> links-oben </td> <td valign="top" align="center"> zentriert-oben </td> <td valign="top" align="right"> rechts-oben </td> </tr> <tr> <td valign="middle" align="left"> links-mitte </td> <td valign="middle" align="center"> zentriert-mitte </td> <td valign="middle" align="right"> rechts-mitte </td> </tr> <tr> <td valign="bottom" align="left"> links-unten </td> <td valign="bottom" align="center"> zentriert-unten </td> <td valign="bottom" align="right"> rechts-unten </td> </tr> </table> </body> </html>
<!DOCTYPE html> <html lang="de"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Hello World!</title> <!-- <link rel="icon" href="img/favicon.svg"> --> <!-- <link rel="stylesheet" href="css/styles.css"> --> <!-- <script type="module" src="js/script.js"></script> --> <!-- <script defer nomodule src="js/script.fallback.js"></script> --> </head> <body> <p>Hello World!</p> <input type="radio" name="Test 0" value="Null" id="id1" checked> <label for="id1">Radio 1</label> <br> <input type="radio" name="Test 1" value="Eins" id="id2"> <label for="id2">Radio 2</label> <br> <input type="checkbox" name="Test 2" value="Zwei" id="id3" autofocus> <label for="id3">Check 1</label> <br> <input type="checkbox" name="Test 3" value="Drei" id="id4" required> <label for="id4">Check 2</label> <br> <input type="checkbox" name="Test 4" value="Drei" id="id5" checked> <label for="id5">Check 3</label> <br> </body> </html>
#!/usr/bin/env bash
#==============================================================================#
# Hiermit kann man Datenübertraun per GET und per POST testen.
#==============================================================================#
#------------------------------------------------------------------------------#
# in FreeBSD:
# chown www:www cgi-bin/test.cgi ; chmod 0770 cgi-bin/test.cgi
#------------------------------------------------------------------------------#
BS="$(uname -s)"
if [ "${BS}" = FreeBSD ] ; then
UMDREHEN="tail -r"
elif [ "${BS}" = Linux ] ; then
UMDREHEN="tac"
fi
### damit awk ein einheitliches Dezimalzeichen verwendet
LANG="C.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
KOMMAzuPUNKT="tr -s ',' '.'"
AWK='awk'
STARTZEIT="$(date +'%FT%T')"
BASE64ZEICHEN='+/0123456789=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
#==============================================================================#
POSTDATEN=$(cat | tr -d '\r')
echo "Content-Type: text/html; charset=utf-8
<!DOCTYPE html>
<html lang='de'>
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1.0'>
<meta name='date' content='${STARTZEIT}' />
<title>Test</title>
<!--
<link rel='stylesheet' href='style.css'>
-->
<style>
body { background-color: #E0E0FF; }
tbody { background-color: #999999; }
tr.rot { background-color: #F08080; }
tr.gelb { background-color: #F0F080; }
tr.gruen { background-color: #80F080; }
tr.blau { background-color: #8080F0; }
tr.dunkelblau { background-color: #BBBBBB; }
tr.hellblau { background-color: #CCCCFF; }
tr:hover {background-color: #AAAAFF;}
</style>
</head>
<body>
<H1>
<a href='/cgi-bin/test.cgi' title='Test' rel='nofollow'>GET- und POST-Test in einer Tabelle</a>
</H1>
<table>
<thead>
<tr class='dunkelblau'>
<th> HTTP_REFERER </th>
<th> ${HTTP_REFERER} </th>
</tr>
<tr class='dunkelblau'>
<th> REQUEST_URI </th>
<th> ${REQUEST_URI} </th>
</tr>
<tr class='dunkelblau'>
<th> QUERY_STRING </th>
<th> ${QUERY_STRING} </th>
</tr>
<tr class='dunkelblau'>
<th> POSTDATEN </th>
<th> ${POSTDATEN} </th>
</tr>
</thead>
<tbody>
<tr class='dunkelblau'>
<td valign='middle' align='center' colspan='2'>
<form method=get enctype=text/plain action='/cgi-bin/test.cgi'>
<input type='submit' name='get-test' value='GET:${BASE64ZEICHEN}' autofocus>
</form>
</td>
</tr>
<tr class='dunkelblau'>
<td valign='middle' align='center' colspan='2'>
<form method=post enctype=text/plain action='/cgi-bin/test.cgi'>
<input type='submit' name='post-test' value='POST:${BASE64ZEICHEN}'>
</form>
</td>
</tr>
</tbody>
</table>
</html>
"
#==============================================================================#
Nur bei der Übertragungsmethode "POST" werden keine Zeichen ("+", "/", "=") ins HTML-Format konvertiert! Da diese Zeichen aber Teil des Base64-Zeichensatzes sind, wird deutlich, dass man per GET keinen Base64-Code übertragen kann!
Mit dem untersten Knopf werden versteckte POST-Daten übertragen. In dem oberen Beispiel sind die POST-Daten als Knopfbeschriftung zu sehen, was bei einer größeren Datenmenge unschön ist.
#!/usr/bin/env bash
#==============================================================================#
# Hiermit kann man Datenübertraun per POST testen.
#==============================================================================#
# +/0123456789=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
#------------------------------------------------------------------------------#
# chown www:www /home/http/cgi-bin/test-post.cgi ; chmod 0770 /home/http/cgi-bin/test-post.cgi
#------------------------------------------------------------------------------#
BS="$(uname -s)"
if [ "${BS}" = FreeBSD ] ; then
UMDREHEN="tail -r"
elif [ "${BS}" = Linux ] ; then
UMDREHEN="tac"
fi
### damit awk ein einheitliches Dezimalzeichen verwendet
LANG="C.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
KOMMAzuPUNKT="tr -s ',' '.'"
AWK='awk'
STARTZEIT="$(date +'%FT%T')"
BASE64ZEICHEN='+/0123456789=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
#==============================================================================#
POSTDATEN=$(cat | tr -d '\r')
echo "Content-Type: text/html; charset=utf-8
<!DOCTYPE html>
<html lang='de'>
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1.0'>
<meta name='date' content='${STARTZEIT}' />
<title>Test</title>
<!--
<link rel='stylesheet' href='style.css'>
-->
<style>
body { background-color: #E0E0FF; }
tbody { background-color: #999999; }
tr.rot { background-color: #F08080; }
tr.gelb { background-color: #F0F080; }
tr.gruen { background-color: #80F080; }
tr.blau { background-color: #8080F0; }
tr.dunkelblau { background-color: #BBBBBB; }
tr.hellblau { background-color: #CCCCFF; }
tr:hover {background-color: #AAAAFF;}
</style>
</head>
<body>
<H1>
<a href='/cgi-bin/test-post.cgi' title='Test' rel='nofollow'>POST-Test mit versteckten Daten</a>
</H1>
<table>
<thead>
<tr class='dunkelblau'>
<th>POSTDATEN (Std)</th>
<th>${POSTDATEN}</th>
</tr>
<tr class='dunkelblau'>
<th>POSTDATEN (pre)</th>
<th><pre>${POSTDATEN}</pre></th>
</tr>
</thead>
<tbody>
<tr class='dunkelblau'>
<td valign='middle' align='center' colspan='2'>
<form method=post enctype=text/plain action='/cgi-bin/test-post.cgi'>
<input type='hidden' name='schlüssel 1' value='1. POST, mit Zeilenumbruch:
${BASE64ZEICHEN}'>
<input type='submit' name='submit' value='Hidden+Submit' autofocus>
</form>
</td>
</tr>
<tr class='dunkelblau'>
<td valign='middle' align='center' colspan='2'>
<form method=post enctype=text/plain action='/cgi-bin/test-post.cgi'>
<input type='hidden' name='schlüssel 2' value='2. POST: Hidden 1'>
<input type='hidden' name='schlüssel 3' value='3. POST: Hidden 2'>
<input type='hidden' name='schlüssel 4' value='4. POST, mit Zeilenumbruch:
Hidden 3'>
<input type='submit' name='submit' value='Multihidden+Submit' autofocus>
</form>
</td>
</tr>
</tbody>
</table>
</html>
"
#==============================================================================#
<input type="text">
<textarea></textarea> <input type="hidden"> <input type="submit">