Google

    

Cookieless Domain

Wednesday, 11 August 2010 10:00

Serve static content from a cookieless Domain

Die Aufgabe: Wir möchten im Google PageSpeed Pluging (für Firefox) einen grünen Haken mehr haben.

Warum? Es macht natürlich Spass schnellere Webseiten als andere Webmaster auszuliefern.

Was bedeutet: "Serve static content from a cookieless Domain" ?

Lade Dateien von einer Domain die keine Cookies ausliefert.
Gemeint sind Bilder, Javascripts und Css-Dateien.
Werden diese Dateien über die eigene Domain ausgeliefert, gibt es jedesmal ein Cookie mit dazu.
Das ist aber völlig überflüssig. Wozu braucht ein Bild ein Cookie? Keine Ahnung, braucht wirklich
Bilder - Javascript - Css brauchen keine Cookies

Wie bekommen wir ein relativ cookiefreies Template hin?

Mit relativ cookiefrei meine ich auch relativ. Je nach Bauart und Programmierstil der in der jeweiligen
Joomla-Komponente angewandt wird bekommen wir das gut bis richtig gut hin.
Die folgenden Schritte sind dem Schwierigkeitsgrad nach aufgelistet.

Schritt 1: Vorbereitung einer Cookieless Domain

Das Anlegen von einer Subdomain sollte in der Regel eine einfache und schnell zu erledigende Maßnahme sein.
Lets do it: Subdomain anlegen.
Am geeignetsten halte ich so Namen wie medias.romacron.de oder cdn.romacron.de, irgend einen Namen anlegen.
Die Subdomain muss auf die selbe Joomla- Seite zeigen.
Gibt man nun in die Browser- Adresstzeile die angelegte Subdomain ein, sollte die selbe Webseite angezeigt werden.

Schritt 2: Die .htaccess anpassen

Da nun eine 2. Domain auf die selbe Joomla Installtion zeigt könnte das zu Dublicate Content führen.
Dublicate Content (gleicher Inhalt mehrmals im Netz), das straft google ordentlich ab.
Kein Problem, wir erlauben über Subdomain keinen Aufruf von irgendwelchen Joomla Sachen.
Wir möchten ausschliesslich Bilder Css und Javascript über die Subdomain aufrufen.

So sieht der Part in der .htaccess aus (diese befindet sich im Joomla Root-Verzeichnis):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# vergleiche ob die angefragte Domain unsere Cookieless Domain ist
 
RewriteCond %{HTTP_Host} (www\.)?images.romacron\.de$ [NC]
 
# Prüfe ob die angefragte Url ein Bild css oder javascript ist
 
RewriteCond %{REQUEST_FILENAME} !(ico|gif|jpg|jpeg|png|flv|pdf|css|js)$
 
# sollte die angefragte Url eine "normale" Url sein, wie man sie
# von einer normalen Joomla Url kennt, leiten wir auf die Hauptseite um
# wir bringen quasi die Url auf den rechten Pfad zurück
 
RewriteRule ^(.*)$ http://www.romacron.de/$1 [R=301,L]
 
# Mit diesem Kniff verweigert man die Ausgabe jeglicher Joomla Inhalte über die
# Subdomain
 
 
 
 

Anpassen des Joomla-Template

Das ist der obere Teil der Template index.php im Joomla Template Ordner

joomla-installation/templates/mein-template/index.php
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

$headerData = $this->getHeadData();
 
$cdnUrl = 'http://www.images.romacron.de';
 
/**
* wenn man auf mootools und caption verzichten kann,
* falls nicht "#" vor jede der beiden Zeilen setzen
**/
unset( $headerData['scripts'][$this->baseurl . '/media/system/js/mootools.js'] );
unset( $headerData['scripts'][$this->baseurl . '/media/system/js/caption.js'] );
 
$headerScripts = $headerData['scripts'];
if ( count( $headerScripts ) > 0 )
{
$rewrittenHeadesScripts = array();
foreach ( $headerScripts as $singleHeaderScripts => $value )
{
$rewrittenHeadesScripts[$cdnUrl . $singleHeaderScripts] = $value;
}
 
$headerData['scripts'] = $rewrittenHeadesScripts;
}
$this->setHeadData( $headerData );
 
# hier geht es weiter mit dem normalen Joomla Template
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->language; ?>" lang="<?php echo $this->language; ?>" >
<head>
<jdoc:include type="head" />
 

Erklärung: Wir lassen lesen alle Headerdaten "<head></head>" die von Joomla übergeben werden
Wir nehmen uns nur die 'scripts' und schreiben die Url auf unsere Cookieless Domain um.
An sich kann der Quellcode oberhalb noch nicht so viel. Es sollten auch die Css-Style Dateien
von der Cookieless Domain abgerufen werden.

Da lohnt es sich ein Plugin zu schreiben. Mit diesem habe ich bereits angefangen.

im nächtsten Part kommt die Datei /plugins/system/sef.php unter das Messer.

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
	// do the SEF substitutions
       	$regex  = '#href="/index.php\?([^"]*)#m';
      	$buffer = preg_replace_callback( $regex, array('plgSystemSEF', 'route'), $buffer );
 
        $protocols = '[a-zA-Z0-9]+:'; //To check for all unknown protocals (a protocol must contain at least one alpahnumeric fillowed by :
      	$regex     = '#(src)="(?!/|'.$protocols.'|\#|\')([^"]*)"#m';
        $buffer    = preg_replace($regex, "$1=\"http://images.romacron.de$base\$2\"", $buffer);
	#$regex     = '#(onclick="window.open\(\')(?!/|'.$protocols.'|\#)([^/]+[^\']*?\')#m';
	#$buffer    = preg_replace($regex, '$1'.$base.'$2', $buffer);
 
 
        $protocols = '[a-zA-Z0-9]+:'; //To check for all unknown protocals (a protocol must contain at least one alpahnumeric fillowed by :
      	$regex     = '#(href)="(?!/|'.$protocols.'|\#|\')([^"]*)"#m';
        $buffer    = preg_replace($regex, "$1=\"$base\$2\"", $buffer);
	$regex     = '#(onclick="window.open\(\')(?!/|'.$protocols.'|\#)([^/]+[^\']*?\')#m';
	$buffer    = preg_replace($regex, '$1'.$base.'$2', $buffer);
 
 
/*     das Original der obereren beiden Blöcke behalten wir zur Sicherheit als Kommentar

  $protocols = '[a-zA-Z0-9]+:'; //To check for all unknown protocals (a protocol must contain at least one alpahnumeric fillowed by :   $regex = '#(src|href)="(?!/|'.$protocols.'|\#|\')([^"]*)"#m';   $buffer = preg_replace($regex, "$1=\"$base\$2\"", $buffer); $regex = '#(onclick="window.open\(\')(?!/|'.$protocols.'|\#)([^/]+[^\']*?\')#m'; $buffer = preg_replace($regex, '$1'.$base.'$2', $buffer); */