Okt 23

In Firmennetzwerken (z.B. Webagenturen) ist es notwendig, dass auf interne Webseiten aus dem lokalen Netzwerk ohne Passworteingabe zugegriffen werden kann, aus externen Netzwerken (z.B. dem Internet) sollte hingegen der Aufruf der Seiten zwar auch möglich sein, allerdings nur nach erfolgreicher Authentifizierung mit Benutzername und Passwort. Somit wird externen Mitarbeitern oder Kunden der Zugriff ermöglicht und alle anderen Besucher, die keinen Zugriff haben sollen, ausgeschlossen.

Mit Apache und dem Modul mod_auth ist diese Konfiguration sehr einfach zu bewerkstelligen. Obendrein ist es auch möglich bestimmten externen IP-Adressen (z.B. von externen Mitarbeitern mit fixen IP-Adressen) den Zugriff ohne Passworteingabe zu ermöglichen. Hierfür wird folgende Konfiguration benötigt:

Order Allow,Deny
AuthType Basic
AuthName "Restricted Files"
AuthUserFile "/var/www/.htpasswd"
Require valid-user
Allow from 127.0.0.1 localhost
Allow from 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 169.254.0.0/16
Satisfy Any

Die Benutzernamen und Passwörter werden in diesem Fall in der Datei “/var/www/.htpasswd” gespeichert. Diese kann recht einfach mit dem Programm “htpasswd” über die Konsole bearbeitet werden. Der Zugriff ist im Beispiel vom lokalen Rechner und aus lokalen (privaten) Netzwerken erlaubt. Zusätzliche vertrauenswürdige IP-Adressen oder ganze Netzwerke können selbstverständlich hinzugefügt werden.

Die Konfiguration kann sowohl in einer .htaccess-Datei eingefügt werden, als auch direkt in den Konfigurationsdateien des Apache (httpd.conf bzw. apache2.conf) erfolgen.

Okt 22

Bei der Erstellung eines Login- bzw. Logout-Links muss man darauf achten, dass dieser nicht im Cache gespeichert werden darf. Würde das Objekt im Cache landen, dann würde bei jedem Besucher der Link/Text angezeigt werden, der beim ersten Aufruf der Seite im Cache gelandet ist. Würde man den Benutzernamen ausgeben, könnte auf jeder Seite ein anderer Benutzername ausgegeben werden und dieser würde nicht mit dem eigenen übereinstimmen. Deshalb muss man anstelle des “normalen” “COA” (Content Object Array) auf die ungecachte Variante “COA_INT” zurückgreifen. Die Grundstruktur des TypoScript sieht wie folgt aus:

[usergroup = *]
	temp.login = COA_INT
	temp.login {
		10 = TEXT
		10 {
			value = Abmelden
			lang.en = Logout
			typolink {
				parameter = 1
				additionalParams = &logintype=logout
			}
		}
	}
[else]
	temp.login = COA_INT
	temp.login {
		10 = TEXT
		10 {
			value = Anmelden
			lang.en = Login
			typolink {
				parameter = 2
			}
		}
	}
[global]

Angepasst werden müssen lediglich die Werte für “typolink.parameter”. Möchte man z.B. beim Abmelden den Benutzer auf der selben Seite belassen und nicht (in diesem Beispiel auf die Seite mit der ID 1) umleiten, so schreibt man anstelle von “parameter = 1″ “parameter.data = TSFE:id”.

Okt 21

Flash wird in letzter Zeit wieder populärer, so wird es auf beinahe jeder neugestalteten Startseite von Firmen (z.B. A1 (zeitweise auch ohne Flash), aon, Dell,…) eingesetzt um neueste Produkte zu präsentieren. Der von Flash generierte Code zur Einbindung des Films hat bis jetzt noch nie einem vom W3C verabschiedeten Standard entsprochen, seit der letzten Version von Flash wird zusätzlich auch noch JavaScript zum Einbinden verwendet – der generierte Code sieht dann in etwa wie folgt aus:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>flash</title>
<script language="javascript">AC_FL_RunContent = 0;</script>
<script src="AC_RunActiveContent.js" language="javascript"></script>
</head>
<body bgcolor="#ffffff">
<!--Im Film verwendete URLs-->
<!--Im Film verwendeter Text-->
<!-- saved from url=(0013)about:internet -->
<script language="javascript">
	if (AC_FL_RunContent == 0) {
		alert("Diese Seite erfordert die Datei \"AC_RunActiveContent.js\".");
	} else {
		AC_FL_RunContent(
			'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0',
			'width', '676',
			'height', '405',
			'src', 'flash',
			'quality', 'high',
			'pluginspage', 'http://www.macromedia.com/go/getflashplayer',
			'align', 'middle',
			'play', 'true',
			'loop', 'true',
			'scale', 'showall',
			'wmode', 'window',
			'devicefont', 'false',
			'id', 'flash',
			'bgcolor', '#ffffff',
			'name', 'flash',
			'menu', 'true',
			'allowFullScreen', 'false',
			'allowScriptAccess','sameDomain',
			'movie', 'flash',
			'salign', ''
			); //end AC code
	}
</script>
<noscript>
	<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="676" height="405" id="flash" align="middle">
	<param name="allowScriptAccess" value="sameDomain" />
	<param name="allowFullScreen" value="false" />
	<param name="movie" value="flash.swf" />
	<param name="quality" value="high" />
	<param name="bgcolor" value="#ffffff" />
	<embed src="flash.swf" quality="high" bgcolor="#ffffff" width="676" height="405" name="flash" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
	</object>
</noscript>
</body>
</html>
Betrachtet man ausschließlich den “noscript”-Teil (der für die Einbindung ausreichend wäre), so findet man bereits hier zwei verschiedene Ansätze der Einbindung vor. Zum einen mittels “classid” über ActiveX, zum anderen mittels “embed”-Tag. Der “embed”-Tag stellt kein valides (X)HTML dar, ActiveX ist reine Windows-Technologie und grenzt somit andere Betriebssysteme (diese greifen auf das nicht valide “embed” zurück) aus.
Mit dem MIME-Type “application/x-shockwave-flash” kann allerdings dem Browser mitgeteilt werden, dass es sich beim vorhandenen “object” um einen Flash-Film handelt. Dieser weiß anhand einer hinterlegten Tabelle, wie er mit diesem Format (z.B. auch mit “text/plain”, “image/jpeg”,…) umzugehen hat. Zufälligerweise Glücklicherweise kann dem “object”-Tag der MIME-Type mitgeteilt werden. Die valide Lösung sieht dann wie folgt aus:
<object width="676" height="405" id="flash" data="flash.swf" type="application/x-shockwave-flash">
	<param name="allowScriptAccess" value="sameDomain" />
	<param name="allowFullScreen" value="false" />
	<param name="movie" value="flash.swf" />
	<param name="quality" value="high" />
	<param name="bgcolor" value="#ffffff" />
</object>
Aus Gründen der Kompatibilität mit diversen Browsern muss der Dateiname sowohl im “object”-Tag (data) als auch mit einem “param”-Tag (movie) angegeben werden.
Okt 20

Im Webmaster-Forum WebmasterPark (WMP) findet von 20.10.2008 bis einschl. 17.11.2008 ein SEO-Wettbewerb für den Begriff “Kleindatenhaltung“ statt. Ich (RoyalKnight) habe mich dazu entschlossen auch daran “teilzunehmen”, allerdings werde ich keine Optimierungen an dieser Seite vornehmen. Das einzige, was mich an diesem Wettbewerb interessiert ist, wie gut diese (nicht optimierte) Seite/Domain im Gegensatz zu einer optimierten Seiten abschneidet. Diese Seite wird (zumindest für mich) als Referenz dienen und zeigen, wer (k)ein guter SEO ist und vor bzw. nach dieser Seite positioniert ist. Den übrigen Teilnehmern wünsche ich gutes Gelingen.

Okt 12

Manchmal ist es erforderlich z.B. ein TMENU mit einem eigenen PHP-Skript zu beeinflussen, weil mit TypoScript das gewünschte Ziel nicht erreicht werden kann. Das könnte z.B. dann der Fall sein, wenn Inhalte aus einer externen Datenbank (z.B. Anzahl der vorhandenen Einträge) im Menü zusätzlich zum bereits vorhandenen Navigationstext ausgegeben werden müssen. TYPO3 stellt hierfür “itemArrayProcFunc” bereit.

Die PHP-Funktion erstellen wir im Ordner “fileadmin/scripts/” und nennen es in diesem Fall “navigation.php”. Die Klasse muss “user_” gefolgt vom Dateinamen heißen, hier also “user_navigation”. Die Methoden können beliebig benannt werden, hier “itemArray”. Die rohe Datei “navigation.php” sieht nun wie folgt aus:

<?php

class user_breadcrumb {

	function itemArray($content, $conf) {

		for ($i = 0; $i < count($content); ++$i) {
			# YOUR CODE GOES HERE
		}

		return $content;
	}

}

?>

Diese muss nun im TypoScript mittels “includeLibs.”, gefolgt von einem eindeutigen Identfier, hier dem Dateinamen – also “includeLibs.navigation”, eingebunden werden. Zum Aufrufen der Methode, gibt es “itemArrayProcFunc”, die den Wert Klassenname, Pfeiloperator, Methode erhalt, in diesem Fall also “user_navigation-> itemArray”. Das TypoScript sieht danach wie folgt aus:

includeLibs.navigation = fileadmin/scripts/navigation.php

temp.navigation = HMENU
temp.navigation {
	1 = TMENU
	1 {
		itemArrayProcFunc = user_navigation->itemArray
		wrap = <ul id="navigation"> | </ul>
		noBlur = 1

		NO = 1
		NO {
			stdWrap.htmlSpecialChars = 1
			wrapItemAndSub = <li class="first"> | </li> |*| <li> | </li>
		}

		ACT < .NO
		ACT {
			wrapItemAndSub = <li class="first active"> | </li> |*| <li class="active"> | </li>
		}
	}
}

Zu berücksichtigen ist, dass das PHP-Skript im Ordner “typo3/sysext/cms/tslib/media/scripts/” abgelegt werden muss, wenn im Install-Tool die Option “noPHPscriptInclude” aktiviert wurde. Das hat zur Folge, dass der “includeLibs”-Pfad im TypoScript angepasst und bei jeder Aktualisierung von “typo3_src” die Datei erneut in den “typo3/sysext/cms/tslib/media/scripts/”-Ordner kopiert werden muss.