Google Analytics Multi Domains

Einführung in das Tracken mehrerer Domains

Im Regelfall ist ein Google Analytics Profil für eine bestimmte Domain eingerichtet: http://domain.tld oder auch http://www.domain.tld. Aber eventuell möchten Sie die Daten mehrerer (Sub)Domains in einem Profil bündeln. Damit mehrere Subdomains dasselbe Cookie, welches von Google Analytics verwendet wird, nutzen können, muss die Domain über den setDomainName-Aufruf korrekt gesetzt sein!

Tracken mehrerer Subdomains

Für den Fall, dass Sie mehrere Subdomains (web.domain.tld, blog.domain.tld, shop.domain.tld) in einem Profil tracken möchten, ändern Sie den Tracking Code wie folgt ab (beachten Sie den Punkt im setDomainName-Aufruf):

...

var _gaq = gaq || [];

_gaq.push(['_setAccount', 'UA-XXXXXXXX-XX']);

_gaq.push(['_setDomainName', '.domain.tld']);

_gaq.push(['_trackPageview']);

...

Tracken mehrerer Domains

Dann müssen Sie den Tracking-Code auf den drei (Sub)Domains wie folgt beschrieben anpassen. Ausserdem müssen alle Links und Formular-Aktionen auf die jeweils andere Domain ebenfalls anpassen.Angenommen Sie haben die folgenden zwei Subdomains: web.domain.tld, shop.domain.tld und eine weitere Domain für das Blog: blog-domain.tld.

web.domain.tld

...

var _gaq = gaq || [];

_gaq.push(['_setAccount', 'UA-XXXXXXXX-XX']);

_gaq.push(['_setDomainName', 'domain.tld']);

_gaq.push(['_setAllowLinker', true]);

_gaq.push(['_trackPageview']);

...

<a href="http://blog-domain.tld/home" onclick="_gaq.push(['_link', 'http://blog-domain.tld/home']); return false;">JUMP TO BLOG</a>

<form name="f" method="post" onsubmit="_gaq.push(['_linkByPost', this]);">

shop.domain.tld

...

var _gaq = gaq || [];

_gaq.push(['_setAccount', 'UA-XXXXXXXX-XX']);

_gaq.push(['_setDomainName', 'domain.tld']);

_gaq.push(['_setAllowLinker', true]);

_gaq.push(['_trackPageview']);

...

<a href="http://blog-domain.tld/home" onclick="_gaq.push(['_link', 'http://blog-domain.tld/home']); return false;">JUMP TO BLOG</a>

<form name="f" method="post" onsubmit="_gaq.push(['_linkByPost', this]);">

blog-domain.tld

...

var _gaq = gaq || [];

_gaq.push(['_setAccount', 'UA-XXXXXXXX-XX']);

_gaq.push(['_setDomainName', 'blog-domain.tld']);

_gaq.push(['_setAllowLinker', true]);

_gaq.push(['_trackPageview']);

...

<a href="http://shop.domain.tld/start" onclick="_gaq.push(['_link', 'http://shop.domain.tld/start']); return false;">JUMP TO SHOP</a>

<form name="f" method="post" onsubmit="_gaq.push(['_linkByPost', this]);">

Die link- und linkByPost Aufrufe sorgen dafür, dass die Cookiedaten der aktuellen Domain an die Zieldomain per POST übergeben und auch von der Zieldomain aus den POST-Daten gelesen werden.

Tracken von einer Domain und einem Unterverzeichnis einer anderen Domain

In dem Beispiel nehmen wir an, es existieren die Domains: web.domain.tld, blog-service-domain.tld/myblog. Die zweite Domain stammt dabei von einem Blogservice, der verschiedene Blogs hostet:

web.domain.tld

...

var _gaq = gaq || [];

_gaq.push(['_setAccount', 'UA-XXXXXXXX-XX']);

_gaq.push(['_setDomainName', 'domain.tld']);

_gaq.push(['_setAllowLinker', true]);

_gaq.push(['_trackPageview']);

...

<a href="http://blog-service-domain.tld/myblog/home" onclick="_gaq.push(['_link', 'http://blog-service-domain.tld/myblog/home']); return false;">JUMP TO MYBLOG</a>

<form name="f" method="post" onsubmit="_gaq.push(['_linkByPost', this]);">

blog-service-domain.tld/myblog

...

var _gaq = gaq || [];

_gaq.push(['_setAccount', 'UA-XXXXXXXX-XX']);

_gaq.push(['_setDomainName', 'none']);

_gaq.push(['_setAllowLinker', true]);

_gaq.push(['_trackPageview']);

...

<a href="http://web.domain.tld/start" onclick="_gaq.push(['_link', 'http://web.domain.tld/start']); return false;">JUMP TO MYPAGE</a>

<form name="f" method="post" onsubmit="_gaq.push(['_linkByPost', this]);">

Tracking eines einzigen Unterverzeichnisses

Angenommen Sie haben einen lediglich ein Unterverzeichnis auf einer Domain, welches getrackt werden soll: domain.tld/mywebsite. Und Sie möchten in Ihrem Profil bei Google Analytics lediglich Berichte zu diesem Unterverzeichnis erzeugen. Dann sollten sie den setCookiePath-Aufruf folgendermassen einsetzen:

...

var _gaq = gaq || [];

_gaq.push(['_setAccount', 'UA-XXXXXXXX-XX']);

_gaq.push(['_setCookiePath', '/mywebsite']);

_gaq.push(['_trackPageview']);

...

In diesem Fall werden für diesen Pfad eigene Cookies angelegt. Macht man dies nicht, dann werden die Berichte von poteniell anderem Tracking Code auf der Domain domain.tld beeinflusst und damit verfälscht!

Quickstart mit Google Analytics

Anlegen eines Google Analytic Kontos

  • Gehen Sie auf Google Analytics
  • Melden Sie sich mit ihrem Google Konto (Google Mailadresse) an oder Erstellen Sie ein neues Konto

Im nächsten Schritt wählen Sie http:// oder https:// aus und geben die URL Ihrer Website an.

Im Anschluss wird Ihnen ein Tracking Code und ein Tracking Identifizier angezeigt (UA-XXXXXXXX-XX). 

Page View Tracking

Für das Aufzeichnen von Seitenansichten fügen Sie einfach den folgenden Code auf den entsprechenden Seiten direkt vor dem schliessenden Body-Tag </body> ein:

<script type="text/javascript">

(function() {

var s = document.getElementsByTagName('script')[0];

if (s.src.indexOf('.google-analytics.com/ga.js') == -1) {

var ga = document.createElement('script');

ga.type = 'text/javascript';

ga.async = true;

ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';

s.parentNode.insertBefore(ga, s);

}}

)();

var _gaq = _gaq || [];

_gaq.push(['_setAccount', 'UA-XXXXXXXX-XX']);

_gaq.push(['_trackPageview']);

</script>

Wenn mal was nicht geht

Der verwendete Tracking Code ist sensibel. Achten Sie auf:

  • Korrekten Methodennamen
  • Großkleinschreibung (gerade bei Methodennamen)
  • Keine unnötigen Leerzeichen in den Parametern
  • String-Parameter in Anführungszeichen
  • Nicht-String-Parameter ohne Anführungszeichen

Wann sind die Daten sichtbar?

Google aktualisiert die Daten in den Berichten erst nach 24 Stunden. Man sieht das Ergebnis seiner Arbeit damit erst frühestens am nächsten Tag :-).

Webseiten auf Basis von Joomla (und anderen CMS)

Webseiten, die mithilfe eines CMS erstellt wurden, verwenden in der Regel einen Templatemechanismus. Bei Joomla findet man im Verzeichnis des aktuell verwendeten Templates eine index.php. Diese Datei wird zum erzeugen jeder Seite herangezogen. Demzufolge sollte der Tracking Code hier eingefügt werden!

Filter [optional]

Filter sind optional und werden verwendet, um Analytics Daten für ein Profil von bestimmten Nutzern/Domainen/Orten ein-/auszuschliessen. Um die gesammelten Daten nicht zu verfälschen, sollten Filter möglichst frühzeitig eingerichtet werden, denn diese werden auf die bis zur Einrichtung des Filters gesammelten Daten nicht angewendet!

Nutzerverwaltung

Sie können Ihrem Analytics Konto weitere Google Nutzer hinzufügen. Fügen Sie jemanden als Kontoadministrator hinzu, hat er Zugriff auf alle Profile und kann dort Einstellungen vornehmen. Alternativ können Sie jemanden hinzufügen, der nur Berichte sehen darf. Sie können dann selektieren, zu welchen Profilen er Berichte einsehen kann.

Subversion Repositories einrichten

Subversion und Apache einrichten: xampp herunterladen und installieren subversion 1.6 herunterladen und installieren Verzeichnisse für die Repositories anlegen

C:/Repositories/projekt1
C:/Repositories/projekt2
C:/Repositories/projekt3

Repositories anlegen

svnadmin create C:/Repositories/projekt1
svnadmin create C:/Repositories/projekt2
svnadmin create C:/Repositories/projekt3

Apache Module vom Subversion-Installationspfad/bin in das modules-Verzeichnis des Apache kopieren{{{ mod_dav_svn.so mod_authz_svn.so }}} Apache Konfiguration anpassen (httpd.conf)

LoadModule dav_module       modules/mod_dav.so
LoadModule dav_svn_module   modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

Benutzer anlegen (dazu in das bin-Verzeichnis des Apache wechseln), es wird nach jedem Befehl nach dem Passwort gefragt. Die Datei svn-auth-file kann irgendwo liegen.

htpasswd -cm C:\svn-auth-file benutzer1
htpasswd -m C:\svn-auth-file benutzer2
htpasswd -m C:\svn-auth-file benutzer3

Die Datei C:/svn-acl mit folgendem Inhalt anlegen. Die Datei svn-acl sollte bei der svn-auth-file liegen.

[groups]
team1 = benutzer1,benutzer2
team2 = benutzer3
[projekt1:/]
@team1 = rw
* = r
[projekt2:/]
@team2 = rw
* = r
[projekt3:/]
benutzer1 = rw
benutzer2 = r
benutzer3 = rw
* = r

Apache Konfiguration anpassen (httpd.conf)

<Location /projekt1>
  DAV svn
  SVNPath C:/Repositories/projekt1
  AuthType Basic
  AuthName "Subversion Projekt1 repository"
  AuthUserFile C:/svn-auth-file
  Require valid-user
  AuthzSVNAccessFile C:/svn-acl
</Location>
<Location /projekt2>
  DAV svn
  SVNPath C:/Repositories/projekt2
  AuthType Basic
  AuthName "Subversion Projekt2 repository"
  AuthUserFile C:/svn-auth-file
  Require valid-user
  AuthzSVNAccessFile C:/svn-acl
</Location>
<Location /projekt3>
  DAV svn
  SVNPath C:/Repositories/projekt3
  AuthType Basic
  AuthName "Subversion Projekt3 repository"
  AuthUserFile C:/svn-auth-file
  Require valid-user
  AuthzSVNAccessFile C:/svn-acl
</Location>

Apache neu starten bzw am Besten den Rechner neu starten. Die Repositories sind unter http://localhost/projektX zu erreichen. Mit dem Script repo-backup.vbs können Repository-Dumps angelegt werden:

Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8

Const repository1 = "C:\Repositories\PARIMEO"
Const repositorydump1 = "C:\RepositoriesDump\PARIMEO"
Const repository2 = "C:\Repositories\PARIMEOAPPS"
Const repositorydump2 = "C:\RepositoriesDump\PARIMEOAPPS"
Const repository3 = "C:\Repositories\PARIMEOTIME"
Const repositorydump3 = "C:\RepositoriesDump\PARIMEOTIME"
Const repository4 = "C:\Repositories\PARIMEOLOUNGE"
Const repositorydump4 = "C:\RepositoriesDump\PARIMEOLOUNGE"
Const repository5 = "C:\Repositories\PARIMEOSPIELWIESE"
Const repositorydump5 = "C:\RepositoriesDump\PARIMEOSPIELWIESE"


getYoungest = "svnlook.exe youngest "

Set objFSO = CreateObject( "Scripting.FileSystemObject" )
Set WshShell = CreateObject( "WScript.Shell" )

Call CreateDump( repositorydump1, getYoungest & repository1, repository1 )
Call CreateDump( repositorydump2, getYoungest & repository2, repository2 )
Call CreateDump( repositorydump3, getYoungest & repository3, repository3 )
Call CreateDump( repositorydump4, getYoungest & repository4, repository4 )
Call CreateDump( repositorydump5, getYoungest & repository5, repository5 )

WScript.Quit( 0 )

'********************************************************************************
'*
'* End of script body
'*
'********************************************************************************

Sub CreateDump( repositorydump, getYoungestCmd, repository )
  ' Default last revision is 0
  lastRev = 0
  
  ' Does the file exist?
  If ( objFSO.FileExists( repositorydump & "\dump.last" ) ) Then
    Set objFile = objFSO.GetFile( repositorydump & "\dump.last" )
    ' Does it contain anything?
    If ( objFile.Size > 0 ) Then
      Set objTextFile = objFSO.OpenTextFile( repositorydump & "\dump.last", ForReading )
      ' Get the last revison and increase it by 1
      lastRev = objTextFile.Readline
    End If
  End If
  
  ' Execute the getYoungestCmd and read its output
  Set objExec = WshShell.Exec( getYoungestCmd )
  
  Do While ( objExec.Status <> 1 )
       WScript.Sleep 100
  Loop
  
  youngest = objExec.StdOut.Readline
  
  ' Is the youngest revision above the last one?
  If not ( youngest > lastRev ) Then
    Set objLogFile = objFSO.OpenTextFile( repositorydump & "\dump.log", ForAppending, True )
    objLogFile.WriteLine Now & " No DUMP neccessary"
    objLogFile.Close
    Exit Sub
  End If
  
  ' Compose the file name
  dumpFileName = repositorydump & "\dump" & "-" & lastRev+1 & "-" & youngest & ".dmp"
  
  ' Add incremental, if not starting a new dump
  incremental = ""
  If ( lastRev > 0 ) Then
    incremental = " --incremental"
  End If
  
  ' Compose the dump command for the current repository
  dumpCommand = "svnadmin.exe dump " & repository & "
 --revision " & lastRev+1 & ":" & youngest & incremental ' Open the destination file and execute the dump command Set objDumpFile = objFSO.OpenTextFile( dumpFileName, ForWriting, True ) Set objExecDump = WshShell.Exec( dumpCommand ) ' Read the dump output and write it to the file Do While True If Not objExecDump.StdOut.AtEndOfStream Then input = objExecDump.StdOut.Read( 1 ) objDumpFile.Write input Else Exit Do End If Loop objDumpFile.Close ' Write the latest revision into the file Set objTextFile = objFSO.OpenTextFile( repositorydump & "\dump.last", ForWriting, True ) objTextFile.Write youngest objTextFile.Close Set objLogFile = objFSO.OpenTextFile( repositorydump & "\dump.log", ForAppending, True ) objLogFile.WriteLine Now & " " & dumpCommand objLogFile.Close End Sub

Das Skript erstellt inkrementelle Backups beginnend bei Revision 0 und dann immmer von der zuletzt gesicherten Revision zur aktuellen Revision.

Zertifikat anlegen

Erstellen des privaten Key für den Server. Dieser ist unbedingt geheim zu halten und zu sichern! Im ersten Schritt wird der Key erzeugt, im zweiten der Certificate Signing Request. Der CSR wird in der Regel an eine Zertifizierungsstelle gesendet. Alternativ kann daraus auch ein self-signed Certificate erstellt werden. Mit dem dritten Befehl wird der CSR nochmals überprüft.
cd apache/conf
openssl genrsa -out server-private-key.key 2048
openssl req -new -key server-private-key.key -out server-signing-request.csr
 -config apache/bin/openssl.cnf openssl req -noout -text -in server-signing-request.csr -config apache/bin/openssl.cnf

Dann kann ein sich selbst signierendes Zertifikat erstellt werden (dieses ist dann für 365 Tage gültig):

openssl x509 -req -days 365 -in server-signing-request.csr
 -signkey server-private-key.key -out server-certificate.crt

Überprüfen kann man ein Zertifikat mit:

openssl asn1parse -inform PEM -in server-certificate.crt

Bei der XAMPP Installation ist in der HTTP.CNF bereits eine HTTP-SSL.CNF eingebunden, die die entsprechenden Dateien (CSR, CRT, ...) aus den analog benannten Unterverzeichnissen einbindet.

Offizielles Zertifikat

Um ein "offizielles" SSL-Zertifikat zu erhalten, muss der CSR an die Zertifizierungsstelle übermittelt werden, z.B. durch Ausfüllen eines Online-Bestellformulars. Man erhält dann im allgemeinen einen Downloadlink (mit Passwort) und eine Rechnung. Nach Prüfung aller Unterlagen ist das Zertifikat erstellt und kann installiert werden.

Bei der Bestellung von SSL Zertifikaten muss man beachten, dass nicht alle Zertifikate gleich sind. Die billigen Zertifikate besagen im Grunde nicht mehr, als dass der Aussteller des Zertifikats das Zertifikat per email an den Inhaber der Domain sendet ( Diese E-Mail-Adresse ist gegen Spambots geschützt! JavaScript muss aktiviert werden, damit sie angezeigt werden kann. , Diese E-Mail-Adresse ist gegen Spambots geschützt! JavaScript muss aktiviert werden, damit sie angezeigt werden kann. usw.), wer auch immer das ist. Bei den teureren Zertifikaten wird schon ernsthafter geprüft (Handelsregisterauszug, Personalausweis, telefonischer Rückruf usw.), ob der Inhaber tatsächlich derjenige ist, der er vorgibt zu sein.

Ein weiterer Gesichtspunkt ist die Kompatibilität zu verschiedenen Browsern. Ein "alter" Browser erkennt die Zertifikate eines "neuen" Ausstellers nicht, was für den Endanwender im Grunde dasselbe ist wie ein selbsterstelltes oder gar kein Zertifikat. Dies ist ein Problem mit vielen Billiganbietern. Es handelt sich hierbei zwar um offizielle Zertifikate, die aber nicht mit allen Browsern ohne Fehlermeldung funktionieren. Da die alten Browser jedoch praktisch ausgestorben sind, ist dies im Grunde nicht mehr relevant

Zuletzt sollte man noch darauf achten, ob das Zertifikat ohne weiteres im Webserver zu installieren ist oder ob es ein Zwischenzertifikat erfordert. Falls ja, hat man beim Installieren etwas mehr Aufwand.

Ein billiger und guter Anbieter ist https://www.psw.net/, der zahlreiche Zertifikate verschiedener Hersteller liefert. Sollte es mal Probleme geben, bekommt man auch umgehend kompetente Beratung - ein wichtiger Pluspunkt, wenn man ein Zertifikat für den kommerziellen Einsatz benötigt.

Ich verwende für eigene Webseiten das "LimitBreaker?" Zertifikat für € 39,- pro Jahr. Es ist auch mit wirklich uralten Browsern kompatibel, beispielsweise mit dem Microsoft Internet Explorer 3.0, Opera 3.0 und Netscape 2.0. Außerdem benötigt es kein Zwischenzertifikat auf dem Webserver.

Das "LimitBreaker?" Zertifikat wird bestätigt, indem die Autorisierungsstelle eine Email an eine bestimmte Email-Adresse sendet. Falls man das Zertifikat für einen Kunden bestellt, kann das ein Problem werden, wenn es sich um eine größere Organisation handelt. Alternativ kann man dann das etwas teurere "Comodo Silber" Zertifikat bestellen, dieses kann auch der Auftraggeber bestätigen, muss sich aber vertraglich gegenüber der Autorisierungsstelle verpflichten, seinerseits für den korrekten Einsatz des Zertifikats zu sorgen.

Einige Anbieter stellen auch kostenlose Zertifikate aus, die sind allerdings nur 30 Tage gültig. Ideal für Testzwecke.

Einführung in MAVEN

Maven ist ein Build-Tool, welches mit dem Ziel entwickelt wurde, Entwicklungsprojekte von Binärdateien zu befreien. Ohne Maven ist es so, dass in einem Projekt benötigte JAR-Dateien (Externe Bibliotheken: selbst entwickelt oder von Drittanbietern) eingebunden werden und das Projekt aufblasen (Größe). Diese binären Dateien werden auch im Quellcodeverwaltungssystem (Subversion, etc) mitgeschleppt (Checkin/-out).

Verwendet man Maven in einem Projekt, dann muss das Projekt erstens gewissen Vorgaben (Ordnerstruktur, etc) erfüllen und zweitens Abhängigkeiten zu JAR in der POM.xml definieren. In der Standardkonfiguration von Maven schaut Maven im Repository nach, welches unter <Benutzerordner>/.m2/repository/ zu finden ist.

Man kann jetzt in zwei Stufen dieses Verhalten ändern (Voraussetzung es sind irgendwelche Abhängigkeiten in der POM.xml vorhanden):

  1. Man definiert in der POM.xml (des Projektes) weitere Repositories, in denen Maven nach benötigten JAR sucht.
  2. Man ändert das Standardverhalten von Maven (<Benutzerordner>/.m2/settings.xml) und macht Maven in der settings.xml Repositories bekannt, die Maven dann jedesmal mit dem Repository unter <Benutzerordner>/.m2/repository synchronisiert. Dh. Maven holt sich aus den angegebenen Repositorie die benötigten JAR in das Lokale Repository.

Für Schritt zwei gibt es im Internet bereits etliche solche Repositories, auf denen bereits wichtige JAR liegen. Gerade für selbstentwickelte JAR, die in mehreren Projekten verwendet werden sollen und auch weil man bestimmte JAR bestimmter Anbieter häufig verwendet, empfiehlt es sich, ein eigenes zentrales Repository anzulegen.

*