<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>sOLARiZ.de &#124; Gaming related Blog &#187; apache</title>
	<atom:link href="http://solariz.de/tag/apache/feed" rel="self" type="application/rss+xml" />
	<link>http://solariz.de</link>
	<description>Blog aus dem Bereich Spiele, Gaming, Software, Hardware und Technik - alles was interessiert</description>
	<lastBuildDate>Sat, 04 Feb 2012 13:16:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Via Etag und Header Dynamische Seiten cachen</title>
		<link>http://solariz.de/2381/dynamischer_hash_cache_mittels_etag.htm</link>
		<comments>http://solariz.de/2381/dynamischer_hash_cache_mittels_etag.htm#comments</comments>
		<pubDate>Fri, 22 Jan 2010 20:25:00 +0000</pubDate>
		<dc:creator>solariz</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[pagespeed]]></category>

		<guid isPermaLink="false">http://solariz.de/blog/dynamischer_hash_cache_mittels_etag.htm</guid>
		<description><![CDATA[<p>Heute mal wieder was Technisches, die Anforderung eine WebApp. mit großem HTML Transfer (250k) bei einem Kunden mit geringer Bandbreite zügig zum laufen zu bekommen fordert einige Optimierungen. Dinge wie Bilder in komprimierte Sprites, Gzip/Deflate Transport sind getroffen.</p>
<h3>Problem Dynamsiche Webseite</h3>
<p>Die Seite an sich beinhaltet Content an dem mehrere Nutzer ab und an Änderungen vornehmen. Die damit verbundenen unregelmäßigen Änderungen sind zeitlich nicht vorhersehbar und es steht auch keine “Last Modified” Information zur Verfügung. Herkömmliches Browser / Proxy Caching fällt als flach da es sonst passieren kann das ein Browser bei gezwungenem Cache den Inhalt nicht mehr aktuell präsentiert, was auf keinen Fall passieren darf.</p>
<h3>Lösung, Dynamisches Hash-Etag</h3>
<p><a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3NvbGFyaXouZGUvd3AtY29udGVudC91cGxvYWRzLzIwMTAvMDEvZXRhZ19ub2NhY2hlLnBuZw=="><img style="margin: 4px 0px 4px 5px; display: inline; border: 0px;" title="Seite ohne Cache, effektiv 30.5KB Content" src="http://cdn.solariz.de/wp-content/uploads/2010/01/etag_nocache_thumb.png" border="0" alt="Seite ohne Cache, effektiv 30.5KB Content" width="263" height="108" align="right" /></a> Der Content wird nach wie vor in seiner PHP Datei wie &#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Heute mal wieder was Technisches, die Anforderung eine WebApp. mit großem HTML Transfer (250k) bei einem Kunden mit geringer Bandbreite zügig zum laufen zu bekommen fordert einige Optimierungen. Dinge wie Bilder in komprimierte Sprites, Gzip/Deflate Transport sind getroffen.</p>
<h3>Problem Dynamsiche Webseite</h3>
<p>Die Seite an sich beinhaltet Content an dem mehrere Nutzer ab und an Änderungen vornehmen. Die damit verbundenen unregelmäßigen Änderungen sind zeitlich nicht vorhersehbar und es steht auch keine “Last Modified” Information zur Verfügung. Herkömmliches Browser / Proxy Caching fällt als flach da es sonst passieren kann das ein Browser bei gezwungenem Cache den Inhalt nicht mehr aktuell präsentiert, was auf keinen Fall passieren darf.</p>
<h3>Lösung, Dynamisches Hash-Etag</h3>
<p><a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3NvbGFyaXouZGUvd3AtY29udGVudC91cGxvYWRzLzIwMTAvMDEvZXRhZ19ub2NhY2hlLnBuZw=="><img style="margin: 4px 0px 4px 5px; display: inline; border: 0px;" title="Seite ohne Cache, effektiv 30.5KB Content" src="http://cdn.solariz.de/wp-content/uploads/2010/01/etag_nocache_thumb.png" border="0" alt="Seite ohne Cache, effektiv 30.5KB Content" width="263" height="108" align="right" /></a> Der Content wird nach wie vor in seiner PHP Datei wie eh und je ohne Cache generiert. Jedoch wird statt einer direkten Ausgabe des HTML Codes selbiger als Grundlage für eine CRC Summe genommen. Diese CRC Summe dient als Etag um dem Browser zu ermöglichen eine Änderung zu identifizieren. (<a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3NvbGFyaXouZGUvdG9vbC1ib3gvZXRhZ193ZWJzZWl0ZV9jYWNoZV9jYWNoaW5nX2Jlc2NobGV1bmlnZW4uaHRt" target=\"_blank\">Was ist ein Etag ?</a>) Der Vergleich ob wir den Content ausgeben oder nicht liegt jedoch in unserer <a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3NvbGFyaXouZGUvd3AtY29udGVudC91cGxvYWRzLzIwMTAvMDEvZXRhZ19jYWNoZWQucG5n"><img style="margin: 4px 0px 4px 5px; display: inline; border: 0px;" title="Seite aus dem Cache, effektiv 0KB Content" src="http://cdn.solariz.de/wp-content/uploads/2010/01/etag_cached_thumb.png" border="0" alt="Seite aus dem Cache, effektiv 0KB Content" width="263" height="108" align="right" /></a> Serverseiten Hand. Der Client Browser übermittelt via HTTP_IF_NONE_MATCH der ihm bekannten Hash. Wir können nun vergleichen ob unser Content dem des Users entspricht, ist dies der Fall so teilen wir das dem Client mit und beenden die Verbindung ohne weitere Daten zu übertragen. Dadurch beschränkt sich die Übertragung auf die reinen HTTP Header und nicht wie vorher je Seite 250k und mehr.</p>
<p>Das ganze mal von der Code Seite, anhand eines Beispiels, aufgezeigt:</p>
<pre class="brush: php; title: ; notranslate">
$OUT = &quot;Mein Content&quot;;
// Es können auch andere Hash Algos verwendet werden, bei den meisten Benchmarks
// ist md4 allerdings am schnellsten. Da wir hier keine Passwörter o.ä. hashen wollen
// sondern quasi nur eine CRC bilden möchten ist der Algo. nicht so brisant.
$hash = hash(&quot;md4&quot;,$OUT);
header(&quot;Etag: $hash&quot;);
header(&quot;Cache-Control: private, must-revalidate&quot;);
if($_SERVER['HTTP_IF_NONE_MATCH'] AND $_SERVER['HTTP_IF_NONE_MATCH'] == $hash) {
// Browser hat identischen Content bereits lokal
header(&quot;HTTP/1.1 304 Not Modified&quot;); // Browser mitteilen das Seite unverändert
header(&quot;Connection: Close&quot;); // Keep-Alives unterbinden
exit; // Script beenden.
}
echo $OUT;
</pre>
<p>Das hier gezeigt Script ist online zum testen des effektes am eigenen Browser unter <a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=L3Rlc3QvbWFudWVsbGVyLWV0YWcucGhw">dieser URL</a> erreichbar.</p>
<p>Insgesamt brachte dieses unterstützte Cachehandling einen enormen Geschwindigkeitsgewinn. Da die zu beschleunigende Seite aus über 2000 DOM Elementen besteht (250K HTML) war es bei langsamen Verbindungen somit “unschön” zu navigieren. Doch auch im kleinerem Umfeld kann dieses manuelle Tag Handling Vorteile haben. Wichtig ist das man sicherstellt das keinerlei Expire header auf die auszuliefernde Seite gesetzt ist. Denn ist dies der Fall wird primär nach Expire gegangen und erst dann anhand des eTag ein Revalidate durchgeführt.</p>
 <img src="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2381" width="1" height="1" style="display: none;" /> <p><a href="http://solariz.de/?flattrss_redirect&amp;id=2381&amp;md5=1a0e368f3b8d0058a23710acd03d7245" title="Flattr" target="_blank"><img src="http://solariz.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://solariz.de/2381/dynamischer_hash_cache_mittels_etag.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="http://solariz.de/?flattrss_redirect&amp;id=2381&amp;md5=1a0e368f3b8d0058a23710acd03d7245" type="text/html" />"
	</item>
		<item>
		<title>Pagespeed – Distinct / Static Hosts</title>
		<link>http://solariz.de/2250/pagespeed-static-hosts-distinct.htm</link>
		<comments>http://solariz.de/2250/pagespeed-static-hosts-distinct.htm#comments</comments>
		<pubDate>Sat, 02 Jan 2010 11:47:53 +0000</pubDate>
		<dc:creator>solariz</dc:creator>
				<category><![CDATA[Tool Box]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[pagespeed]]></category>

		<guid isPermaLink="false">http://solariz.de/tool-box/pagespeed-static-hosts-distinct.htm</guid>
		<description><![CDATA[<p>In meiner Blog Reihe zur Optimierung der Pagespeed möcht ich heute auf das verwenden von “distinct Hosts” eingehen.</p>
<h3>Einleitung</h3>
<p>Ein Webbrowser ist in der Regel limitiert eine Maximale Anzahl an Verbindungen pro Host aufzubauen. Bei optimierten Browsern wie Opera oder Firefox ist diese Anzahl bereits relativ hoch bzw. teilweise Dynamisch. Bei älteren Browsern dagegen ist hier oftmals ein Limit auf 4 oder 8 Verbindungen pro Host fest gesetzt. Nun, eine Webseite besteht nicht selten aus hunderten Elementen; jede Grafik, jedes JavaScript jeder Ajax Request ist ein “hit” jeder Hit wiederum verlangt in der Client – Server Kommunikation einen kompletten Handshake.</p>
<div id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:d7a33272-ebfd-47a2-8957-da9f2a222d58" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: right; padding: 0px;"><a title=\"Abb. 1\" href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3NvbGFyaXouZGUvd3AtY29udGVudC91cGxvYWRzLzIwMTAvMDEvaGVhZGVyXzAxOHg2LnBuZw=="><img style="border: 0pt none;" title="Abb.1  HTTP Client Server Kommunikation" src="http://cdn.solariz.de/wp-content/uploads/2010/01/header_01.png" border="0" alt="" width="209" height="239" /></a></div>
<p>Eine Typische HTTP Kommunikation ist in <strong>Abb 1</strong> zu sehen, grün ist der “Request” vom Webbrowser (client) an den Server &#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>In meiner Blog Reihe zur Optimierung der Pagespeed möcht ich heute auf das verwenden von “distinct Hosts” eingehen.</p>
<h3>Einleitung</h3>
<p>Ein Webbrowser ist in der Regel limitiert eine Maximale Anzahl an Verbindungen pro Host aufzubauen. Bei optimierten Browsern wie Opera oder Firefox ist diese Anzahl bereits relativ hoch bzw. teilweise Dynamisch. Bei älteren Browsern dagegen ist hier oftmals ein Limit auf 4 oder 8 Verbindungen pro Host fest gesetzt. Nun, eine Webseite besteht nicht selten aus hunderten Elementen; jede Grafik, jedes JavaScript jeder Ajax Request ist ein “hit” jeder Hit wiederum verlangt in der Client – Server Kommunikation einen kompletten Handshake.</p>
<div id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:d7a33272-ebfd-47a2-8957-da9f2a222d58" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: right; padding: 0px;"><a title=\"Abb. 1\" href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3NvbGFyaXouZGUvd3AtY29udGVudC91cGxvYWRzLzIwMTAvMDEvaGVhZGVyXzAxOHg2LnBuZw=="><img style="border: 0pt none;" title="Abb.1  HTTP Client Server Kommunikation" src="http://cdn.solariz.de/wp-content/uploads/2010/01/header_01.png" border="0" alt="" width="209" height="239" /></a></div>
<p>Eine Typische HTTP Kommunikation ist in <strong>Abb 1</strong> zu sehen, grün ist der “Request” vom Webbrowser (client) an den Server und rot ist die vom Server entgegnete Antwort. Wenn man nun annimmt eine Beispiel-Webseite bestünde aus 70 einzelnen Elementen, so wäre dies 70x das selbe Client-Server “geschwätz” was schon einiges an “Kommunikationsaufwand” bedeutet.</p>
<p>In der Realen Welt ist es nicht ungewöhnlich das duzende kleinst Grafiken geladen werden. Mal ein Beispiel an einer einfachen Flagge wie ich sie öfters auf der Seite verwende <img src="http://cdn.solariz.de/wp-content/uploads/2009/04/de.png" alt="" /> Dieses <strong>de.png</strong> ist 129 Bytes klein, allein die nötige Client – Server Kommunikation für diese Flagge umfasst allerdings bereits 1.822 Bytes; Das ist 14x mehr als die Größe der eigentliche Datei selbst.</p>
<p>Vor der eigentlichen Header Übertragung kommen nun noch die üblichen Verzögerungen durch das TCP Protokoll hinzu. Um den Beitrag nicht zu sprengen nur kurz hierzu:</p>
<ol>
<li>Anfrage <a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2hvc3QubmFtZS9kZS5wbmc=">http://host.name/de.png</a></li>
<li>Namensauflösung host.name</li>
<li>Verbindung auf IP Port 80</li>
<li>TCP Handshake</li>
<li>Anfrage Client –&gt; Server (Abb1 grün)</li>
<li>Antwort Server –&gt; Client (Abb1 rot) vorbereiten des Clients auf Datenempfang</li>
<li>Eigentlicher Datentransfer Server –&gt; Client</li>
<li>Bestätigung</li>
<li>Verbindung trennen</li>
</ol>
<p>Diese Prozedur bei jeder noch so kleinen Grafik kostet eben Zeit. Die meisten Browser oder auch das Betriebsystem greifen hier schon unter die Arme in dem z.B. DNS Caches verwendet werden.</p>
<h3>Keep-Alive</h3>
<p>Um das ganze nun weiter zu optimieren unterstützen alle modernen Webbrowser so genannte <strong>Keep-Alive requests</strong>. Diese halten nach Schritt 8 die Verbindung für eine bestimmte Zeitspanne offen und warten sozusagen, auf der selben Leitung, auf weitere Anfragen des Webbrowsers. Somit beschränkt sich die Kommunikation auf das Schema: 1,2,3,4, (5,6,7,8), (5,6,7,8), (5,6,7,8),[…] 9</p>
<p>Da dies für den Webserver aber auch bedeutet Ressourcen an Clients zu “reservieren” ist man als Webmaster hier meist sehr restriktiv. Länge und mehr Keep-Alive Möglichkeiten erhöhen die Gefahr bei viel Ansturm nicht mehr erreichbar für “neue” Clients zu sein. Zudem steigt die Anfälligkeit für einfache DoS Attacken (Denial of Service). In der Antwort des Servers erkennt man in Abb1 die Konfiguration der Keep-Alives in Form von: <strong>Keep-Alive: timeout=6,max=32 </strong>Der Webserver teilt hier dem Browser mit das er die Verbindung 6 Sekunden offen halten kann und maximal 32 Anfragen pro Verbindung akzeptiert.</p>
<h3>Distinct Hosts / Static Domains</h3>
<p>Auch wenn die Kommunikation nun auf Schritt 5-8 beschränkt ist bedeutet das noch nicht das wir die am Anfang der Einleitung angesprochenen Header los sind. In unserem Beispiel “de.png” war der Header ja 14x größer als die eigentlichen Daten. Wie man in Abb1 erkennt beinhalten die HTTP Header viele Informationen die ein statischer Content wie ein PNG niemals brauchen wird. So z.B. Cookies, Etags oder andere erweiterte Cache Informationen. Bleiben wir aber mal bei den Cookies, fast jede Webseite nutzt heutzutage Cookies. Ob für Sessions, zur Identifizierung des Nutzers oder für Analytics. Diese Cookies werden bei jedem Request vom Webbrowser alle an den Webserver geschickt damit dieser, bei Bedarf, diese Informationen auswerten kann. Hier sind wir nun an dem Punkt an dem deutlich wird was ich meine; Wozu braucht ein de.PNG alle meine ? In 99% der Fälle eben gar nicht.</p>
<div id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:a14e5bff-d57b-4eb7-b9ba-9ad556874a33" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: right; padding: 0px;"><a title=\"Abb. 2\" href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3NvbGFyaXouZGUvd3AtY29udGVudC91cGxvYWRzLzIwMTAvMDEvaGVhZGVyXzAyOHg2LnBuZw=="><img style="border: 0pt none;" title="Abb.2  Static HTTP Client Server Kommunikation" src="http://cdn.solariz.de/wp-content/uploads/2010/01/header_02.png" border="0" alt="" width="210" height="172" /></a></div>
<p>Nun kommen die so genannten “<strong>Distinct Hosts</strong>” oder “<strong>Static Domains</strong>” ins Spiel. Neben der eigentlichen Domain der Webseite kommen nun noch eine weitere Subdomain ins Spiel. Statische Inhalte wie Grafiken oder sich nicht ändernde JS Daten werden nun nicht mehr von <a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5zb2xhcml6LmRlL2dmeC8=">http://www.solariz.de/gfx/</a> geladen sondern von einer neuen Subdomain: <a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3N0YXRpYy5zb2xhcml6LmRlLw==">http://static.solariz.de/</a> diese beinhaltet eigentlich 1:1 das selbe wie der vorherige GFX Ordner. Allerdings wird der Webserver hier auf die Auslieferung von statischem Content optimiert. Bei großen Projekten ist es sinnvoll hier einen weiteren Webserver zu verwenden der sich nur um die Auslieferung des statischen Inhalts zu kümmern hat. Damit ist die “Last” des Traffics hierfür vom Hauptwebserver genommen. In <strong>Abb2</strong> sieht man eine Client – Server Kommunikation mit einer optimierten statischen Domain. Diese ist für genau den selben Sinn und Zweck um gut 1KB geschrumpft. Bei unserer Beispiel-Webseite mit 70 Elementen wären dies auch rund 70KB weniger die bei jedem Seitenaufruf transferiert werden müssen.</p>
<p>Oftmals wird für Static Hosts eine sehr abgespeckte Version des Apaches mit minimaler Anzahl an Modulen genutzt. Kein PHP, kein CGI, kein Auth, keine Etag Berechnung. Alles wird auf das nötigste runtergefahren. Somit ist die Kommunikation zwischen Client und Server in der Regel auch schneller.</p>
<p>Doch das waren nicht alle Vorteile, durch die Verwendung einer Subdomains bleiben auch die Cookies außen vor da diese auf der Hauptdomain liegen. Zudem hat der Webbrowser nun die Keep-Alive Range des normalen Hosts für reine HTML Anfragen was die Pageload Zeit beschleunigt.</p>
<p>Zu guter letzt sei noch zu erwähnen das zeitgleich somit 2x soviel Verbindungen aufgebaut werden könnten und das Laden von mehreren Hosts somit Parallel erfolgen kann.</p>
 <img src="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2250" width="1" height="1" style="display: none;" /> <p><a href="http://solariz.de/?flattrss_redirect&amp;id=2250&amp;md5=57efd39379caf032da122d027a0d7a46" title="Flattr" target="_blank"><img src="http://solariz.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://solariz.de/2250/pagespeed-static-hosts-distinct.htm/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<atom:link rel="payment" href="http://solariz.de/?flattrss_redirect&amp;id=2250&amp;md5=57efd39379caf032da122d027a0d7a46" type="text/html" />"
	</item>
		<item>
		<title>HTTP ETag, Nutzen und Funktionsweise</title>
		<link>http://solariz.de/2044/etag_webseite_cache_caching_beschleunigen.htm</link>
		<comments>http://solariz.de/2044/etag_webseite_cache_caching_beschleunigen.htm#comments</comments>
		<pubDate>Mon, 14 Dec 2009 20:28:02 +0000</pubDate>
		<dc:creator>solariz</dc:creator>
				<category><![CDATA[Tool Box]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[Howto]]></category>
		<category><![CDATA[pagespeed]]></category>

		<guid isPermaLink="false">http://solariz.de/tool-box/etag_webseite_cache_caching_beschleunigen.htm</guid>
		<description><![CDATA[<p>In einem kommenden Post zum Thema WordPress und Pagespeed Optimierung möchte ich einige Methoden aufgreifen wie man den eigenen Blog mit meist einfachen Hausmitteln beschleunigen kann. Um nicht alles in einem Endlos Posting abzuwickeln erkläre ich vorab einige Themen auf die ich dann später in den entsprechenden Passagen wieder zurück kommen werde.</p>
<h3>Heute – Der oder das ETag</h3>
<p><a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3NvbGFyaXouZGUvd3AtY29udGVudC91cGxvYWRzLzIwMDkvMTIvZXRhZ19zdGFya192ZXJlaW5mYWNodC5wbmc="><img style="margin: 2px auto; display: block; float: none; border: 0px;" title="etag_stark_vereinfacht" src="http://cdn.solariz.de/wp-content/uploads/2009/12/etag_stark_vereinfacht_thumb.png" border="0" alt="etag_stark_vereinfacht" width="439" height="331" /></a></p>
<p><img style="margin: 2px 0px; display: inline; border: 0px;" title="etag_abb1" src="http://cdn.solariz.de/wp-content/uploads/2009/12/etag_abb1.png" border="0" alt="etag_abb1" width="300" height="260" align="right" /> <strong>ETag steht für Entity-Tag</strong>, dieses Tag kann ein Bestandteil eines HTTP Headers sein. Das Tag beinhaltet einen Hexadezimalen Wert welcher Auskunft über den Inhalt einer Datei gibt. Das ETag wird bei modernen Browsern zur Cachesteuerung eingesetzt und stellt quasi eine Quersumme einer Datei dar.</p>
<p>Beim ersten anfordern einer Datei teilt der Webserver im HTTP Header das Etag dieser mit, der Browser &#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>In einem kommenden Post zum Thema WordPress und Pagespeed Optimierung möchte ich einige Methoden aufgreifen wie man den eigenen Blog mit meist einfachen Hausmitteln beschleunigen kann. Um nicht alles in einem Endlos Posting abzuwickeln erkläre ich vorab einige Themen auf die ich dann später in den entsprechenden Passagen wieder zurück kommen werde.</p>
<h3>Heute – Der oder das ETag</h3>
<p><a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3NvbGFyaXouZGUvd3AtY29udGVudC91cGxvYWRzLzIwMDkvMTIvZXRhZ19zdGFya192ZXJlaW5mYWNodC5wbmc="><img style="margin: 2px auto; display: block; float: none; border: 0px;" title="etag_stark_vereinfacht" src="http://cdn.solariz.de/wp-content/uploads/2009/12/etag_stark_vereinfacht_thumb.png" border="0" alt="etag_stark_vereinfacht" width="439" height="331" /></a></p>
<p><img style="margin: 2px 0px; display: inline; border: 0px;" title="etag_abb1" src="http://cdn.solariz.de/wp-content/uploads/2009/12/etag_abb1.png" border="0" alt="etag_abb1" width="300" height="260" align="right" /> <strong>ETag steht für Entity-Tag</strong>, dieses Tag kann ein Bestandteil eines HTTP Headers sein. Das Tag beinhaltet einen Hexadezimalen Wert welcher Auskunft über den Inhalt einer Datei gibt. Das ETag wird bei modernen Browsern zur Cachesteuerung eingesetzt und stellt quasi eine Quersumme einer Datei dar.</p>
<p>Beim ersten anfordern einer Datei teilt der Webserver im HTTP Header das Etag dieser mit, der Browser verarbeitet diese Datei und speichert beim ablegen im lokalem Cache das zugeordnete Etag. Ein Beispielheader des “Erstkontakts” mit eingebettetem Etag ist in <strong>Abb.1</strong> zu sehen.</p>
<p>Der Browser nutzt das ETag um die Datei auf dem Webserver mit der lokal im Cache liegenden zu vergleichen, ist das ETag beider Dateien identisch so kann davon ausgegangen werden das sich an <img style="margin: 2px 0px; display: inline; border: 0px;" title="etag_abb2" src="http://cdn.solariz.de/wp-content/uploads/2009/12/etag_abb2.png" border="0" alt="etag_abb2" width="300" height="260" align="right" />der Datei nichts geändert hat und der Cache somit Valide ist &#8211; sprich die Datei wird nicht erneut geladen sondern aus dem lokalem Cache geholt. Wird der Inhalt einer Datei modifiziert so ändert sich auch das ETag der Datei und der Webserver sendet in der Regel die Datei neu.</p>
<p>Erhält der Browser in einem HTML Dokument z.B. die Anweisung die Datei <strong>bild.jpg</strong> zu laden prüft er zuerst ob eine <strong>bild.jpg</strong> im lokalem Cache liegt. Wenn dies so ist, und lokal ein ETag dazu gespeichert wurde, wird dem Webserver in der Bildanfrage direkt “mitgeteilt” welche Version der Browser lokal gespeichert hat. Dies Geschieht in der Form:</p>
<p><strong>If-None-Match: &#8220;877f3628b738c76a54&#8243;<img style="margin: 2px 0px; display: inline; border: 0px;" title="etag_abb3" src="http://cdn.solariz.de/wp-content/uploads/2009/12/etag_abb3.png" border="0" alt="etag_abb3" width="300" height="192" align="right" /> </strong></p>
<p>Eine Beispiel für einen vom Browser, zur validierung, verschickten Etag ist in <strong>Abb.2</strong> zu sehen. Stellt der Webserver nun fest das dieses ETag der <strong>bild.jpg</strong> identisch mit dem eigenen ist, so wird nur ein “<strong>304 Not Modified</strong>” entgegnet (<strong>Abb.3</strong>) anstatt die ganze Datei erneut quer durch das Internet zu senden. Weicht der Etag jedoch ab so wird der Cacheeintrag als nicht valide betrachtet. Die ebenfalls überlieferte If-Modified-Since anfrage darf bei einem nicht passendem Etag vom Webserver nicht berücksichtigt werden. Dies hat daher in der Regel zur Folge das die Datei erneut vom Webserver übertragen wird.</p>
<p>Nach zugehöriger <strong>RFC2616</strong> darf der Browser auch direkt mehrere Etags, Kommagetrennt, in einem Header anfragen. Dieses Verhalten habe ich in freier Wildbahn aber noch nicht beobachten können.</p>
<h3>unterschiedliche Etag Typen</h3>
<p>Ohne nun trocken die RFC zu rezitieren möchte ich nur kurz auf Technische Unterschiede der Etags eingehen, wem das Technische Bla Bla bereits zu viel wird kann diesen Absatz in aller Ruhe überspringen ^^</p>
<p>In der Theorie könnte ein Etag ein zufällig generierter Wert sein, dies ist aber unsinnig da der Wert ja aufzeigen soll ob sich eine Datei verändert hat oder nicht. Daher haben sich im Apache folgende drei Methoden etabliert; Zum einen wäre da die Methode <strong>MTime</strong> (Last Modified) Information des Dateisystems, nach dieser ändert sich das Etag nur dann wenn die Datei im Filesystem des Servers neu geschrieben wird. (z.B. neue Version via FTP hochgeladen) Eine weitere Möglichkeit ist die Generierung des Tags anhand der Dateigröße, <strong>Size</strong>. Dies ist jedoch alleinstehend recht uninteressant denn eine exakte Dateigröße kann bei kleinen Änderungen schnell zum Nebeneffekt führen das neue Grafiken im Browser nicht angezeigt werden. Die dritte Möglichkeit ist die INode der Datei im Filesystem. Ohne nun in Dateisystemfunktionen abzutauchen; (Da schreiben andere Menschen ganze Bücher von) Die <strong>Inode</strong> ist platt gesagt die Hausnummer einer Datei im Dateisystem. Diese ist alleine wie auch die Size nicht tauglich als Etag. Anders als bei “Size” gibt es hier sogar noch einen weiteren Nachteil, verwendet man über mehrere Server verteilte Dateisysteme (Stichwort <a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=L2Jsb2cvY29udGVudF9kZWxpdmVyeV9uZXR3b3JrX3dvcmRwcmVzc19ibG9nX2V4cGVyaW1lbnQuaHRt" target=\"_blank\">CDN</a>) so ist die Inode von Webserver zu Webserver unterschiedlich.</p>
<p>Eine wesentlich Ressourcen intensivere Möglichkeit wäre z.B. bei dynamischem PHP Content einen Etag manuell anhand eines selbst generierten Hashwertes des Contents zu generieren.</p>
<p>Neben den eigentlichen Typen gibt es noch die <strong>Unterscheidung in starke und schwache Etags</strong>, diese Mitteilung sendet ebenfalls der Webserver beim Erstkontakt. Ein starker Etag darf eigentlich nur dann verwendet werden wenn man sagen kann das alle Daten die diesen Etag verwenden dann auch absolut identisch sind (Bit-für-Bit). Nutzt man z.B. nur eine der oben aufgeführten Methoden so müsste dies als schwacher Etag gekennzeichnet werden denn in der Theorie können ja duzende Dateien auf dem Webserver z.B. die exakte MTime haben. Ein schwacher tag wird durch ein vorangestelltes <strong>W/</strong> gekennzeichnet.</p>
<p>Beispiel:           <strong>ETag: W/&#8221;877f3628b738c76a54&#8243;</strong></p>
<h3>Verwendung im Apache</h3>
<p>Im Apache Webserver ist die Verwendung des ETags anhand der <strong>FileETag Direktive</strong> möglich, als Parameter werden die im vorherigem Absatz beschriebenen Methoden akzeptiert. Je nach Hostkonfiguration ist das Etag per Default nicht eingeschalten, hat man Zugriff auf seine Apache Config so kann man dies manuell durch den Eintrag:</p>
<p><strong>FileETag All</strong></p>
<p>in der <strong>httpd.conf</strong> nachholen. Wird es vom Hoster nicht untersagt kann die Direktive auch direkt in der <strong>.htaccess</strong> mit selben Befehl gesetzt werden. Ist beides nicht möglich oder führt zu einem “Serverfehler 500” so fragt man am besten beim Hoster nach ob dies für den eigenen Virtuellen Host eingeschaltet werden könnte.</p>
<h3>Unsinnige Verwendung des Etags</h3>
<p>Nicht immer ist es sinnvoll ein Etag auch zu verwenden, bei statischen Inhalten die sich niemals ändern werden ist ein Etag unnötiger Kommunikationsaufwand. Vielleicht ist schon mal aufgefallen das einige Große Webseiten ihre statischen Inhalte wie Bilder von einer anderen Subdomain liefern, dies hat unter anderem den Vorteil das man hier die Header global für die Subdomain einstellen kann. Nehmen wir an man betreibt eine Newsseite die pro Tag mehrere Artikel veröffentlicht, in den Artikel sind passende Bilder vorhanden die das beschriebene dokumentieren. In der Regel ändern diese Bilder sich nicht sondern werden bei Veröffentlichung des Beitrages online gestellt und verbleiben unverändert dort. Hier nun den Browser und Webserver jedes mal eine Etag Validierung durchführen zu lassen ist unsinnig da man davon ausgehen kann das die Bilder sich nicht verändern. Um dies zu vermeiden setzt man auf das Bilderverzeichnis, oder Subd<br />
omain, <strong>FileETag None</strong>. Statt des tags verwendet man nur den <a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxNC5odG1sI3NlYzE0LjkuMw==" target=\"_blank\">max-age</a> Header mit einer sehr hohen Angabe. (Angabe in Sekunden z.B. 31536000 für ein Jahr) Aber dazu mal in einem anderem Posting mehr ;)</p>
<p>Um dem angesprochenem Problem, mit Etags bei über mehrere Servern verteilten Seiten, Herr zu werden ist es Sinnvoll dem Apache mitzuteilen das er die Inode Methode nicht berücksichtigen soll. Der passende Aufruf wäre: <strong>FileETag MTime Size     <br /></strong>Damit wird der Etag nur aus Modified Time und Dateigröße gebildet.</p>
<h3>Besseres Etag Handling in PHP</h3>
<p>Ok, letzter Absatz ;) Endspurt. Verfügt man über eine in PHP geschriebene Webseite so kann man den Etag bei z.B. Contentseiten oder Stylesheets selbst ausgeben. In Contentseiten nimmt man einfach den darzustellenden Inhalt und generiert daraus einen md5 diesen Hash übergibt man per Funktion in den HTTP Header:  <strong>header(‘ETag: &#8220;’.md5($content).’&#8221;’);</strong></p>
<p>Möchte man das ganze weiter führen so könnte man einen Wrapper via mod_rewrite für JS und CSS Daten auf dem Webserver bauen, dieser würde dann die CSS Files dynamisch anhand ihres Inhaltes mit einem Sicherem Etag versehen. Bei unserem <a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovLzNxLmRl" target=\"_blank\">Hostingprojekt 3Q</a> für kleine-mittelständische Unternehmen handhaben wir dies erfolgreich um die Clientperformance zu steigern und Probleme mit nicht mehr validen Caches zu verhindern. Wichtig beim setzen des Etags über PHP ist natürlich das dann das komplette Handling, also auch das auswerten der “<strong>If-None-Match</strong>” Header über PHP erfolgen muss. Wie genau würde hier nun den sowieso schon sehr gedehnten Rahmen sprengen, bei Interesse komme ich darauf gerne mal in einem gesondertem Posting zurück.</p>
<h3>Weiterführende Links / Quellen</h3>
<ul>
<li><a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxNC5odG1sI3NlYzE0LjE5" target=\"_blank\">RFC2616 ETag response-header specification</a>,</li>
<li><a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy8yLjIvbW9kL2NvcmUuaHRtbCNmaWxlZXRhZw==" target=\"_blank\">Apache Direktive FileETag</a></li>
<li><a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3JlZG1pbmUubGlnaHR0cGQubmV0L3dpa2kvbGlnaHR0cGQvRG9jczpDb25maWd1cmF0aW9uT3B0aW9ucyNMaWdodHRwZENvcmVPcHRpb25z" target=\"_blank\">ETag in lighttpd</a></li>
<li>Weiterführende Lektüre “<em>Concerning Etags and Datestamps</em>” von Lars R. Clausen als <a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5pd2F3Lm5ldC8wNC9DbGF1c2VuLnBkZg==" target=\"_blank\">PDF Download</a></li>
</ul>
 <img src="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2044" width="1" height="1" style="display: none;" /> <p><a href="http://solariz.de/?flattrss_redirect&amp;id=2044&amp;md5=99ce7597d79ae4b4069cc435223f6933" title="Flattr" target="_blank"><img src="http://solariz.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://solariz.de/2044/etag_webseite_cache_caching_beschleunigen.htm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<atom:link rel="payment" href="http://solariz.de/?flattrss_redirect&amp;id=2044&amp;md5=99ce7597d79ae4b4069cc435223f6933" type="text/html" />"
	</item>
		<item>
		<title>Injection Log und Block</title>
		<link>http://solariz.de/696/injection-log-und-block.htm</link>
		<comments>http://solariz.de/696/injection-log-und-block.htm#comments</comments>
		<pubDate>Mon, 12 Jan 2009 19:56:27 +0000</pubDate>
		<dc:creator>solariz</dc:creator>
				<category><![CDATA[Tool Box]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[Howto]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://new.solariz.de/696/injection-log-und-block.htm</guid>
		<description><![CDATA[<p>Ok, ein weiterer Blogeintrag der für nicht Webmaster wohl schier Langweilig sein wird, ich fang einfach mal an :D</p>
<p>“Script Injections” oder auch XSS “Cross Site Scripting” genannt, sind ja nichts unbekanntes mehr, in meinem <a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5zb2xhcml6LmRlL2FwYWNoZXRpcHMvaHRhY2Nlc3NzZWN1cml0eQ==" target=\"_blank\">htaccess Artikel</a> habe ich ja bereits darüber geschrieben. Um das ganze Thema etwas weiter aufzugreifen habe ich mich mal etwas weiter damit beschäftigt. Im Bot-Trap.de Forum (<em>Sollte sich jeder Webmaster mit Spamproblemem auf der Seite übrigens mal ansehen</em>) gab es in einem Beitrag <a onclick=\"javascript:pageTracker._trackPageview ('/outgoing/www.bot-trap.de/forum/index.php?topic=75523.msg122062');\" href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5ib3QtdHJhcC5kZS9mb3J1bS9pbmRleC5waHA/dG9waWM9NzU1MjMubXNnMTIyMDYy" target=\"_blank\">unnötige Arbeit…</a> bereits seit geraumer Zeit einige Diskussionen zum Thema Sicherheit und seit kurzem auch das Thema Injections. Auf der Suche im Web nach einer Liste mit Statistiken über meist verbreite Injection Versuche bin ich leider nicht fündig geworden.</p>
<p>Nach &#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Ok, ein weiterer Blogeintrag der für nicht Webmaster wohl schier Langweilig sein wird, ich fang einfach mal an :D</p>
<p>“Script Injections” oder auch XSS “Cross Site Scripting” genannt, sind ja nichts unbekanntes mehr, in meinem <a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5zb2xhcml6LmRlL2FwYWNoZXRpcHMvaHRhY2Nlc3NzZWN1cml0eQ==" target=\"_blank\">htaccess Artikel</a> habe ich ja bereits darüber geschrieben. Um das ganze Thema etwas weiter aufzugreifen habe ich mich mal etwas weiter damit beschäftigt. Im Bot-Trap.de Forum (<em>Sollte sich jeder Webmaster mit Spamproblemem auf der Seite übrigens mal ansehen</em>) gab es in einem Beitrag <a onclick=\"javascript:pageTracker._trackPageview ('/outgoing/www.bot-trap.de/forum/index.php?topic=75523.msg122062');\" href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5ib3QtdHJhcC5kZS9mb3J1bS9pbmRleC5waHA/dG9waWM9NzU1MjMubXNnMTIyMDYy" target=\"_blank\">unnötige Arbeit…</a> bereits seit geraumer Zeit einige Diskussionen zum Thema Sicherheit und seit kurzem auch das Thema Injections. Auf der Suche im Web nach einer Liste mit Statistiken über meist verbreite Injection Versuche bin ich leider nicht fündig geworden.</p>
<p>Nach einem hin und her habe ich dann meine .htaccess Regeln zum Blocken von GET und POST Injections angepasst um nicht nur einfach ein Forbidden zu liefern, sondern den &#8220;möglichen Angreifer” direkt zu protokollieren. Das Scipt reagiert auf eine angepassten .htacces Eintrag:</p>
<p><span style="font-style: italic; color: #23851c;">#  mod_rewrite</span><br /> <span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">On</span><br /> <span style="font-style: italic; color: #23851c;"># Log injection trys through Query String</span><br /> <span style="color: #00007f;">RewriteCond</span> %{REQUEST_METHOD} =GET [OR]<br /> <span style="color: #00007f;">RewriteCond</span> %{REQUEST_METHOD} =POST [OR]<br /> <span style="color: #00007f;">RewriteCond</span> %{REQUEST_METHOD} =HEAD<br /> <span style="color: #00007f;">RewriteCond</span> %{QUERY_STRING} !injectlog\.php [NC]<br /> <span style="color: #00007f;">RewriteCond</span> %{QUERY_STRING} (ftps?|https?):// [NC,OR]<br /> <span style="color: #00007f;">RewriteCond</span> %{QUERY_STRING} (\&lt;|%3C).*<span style="color: #00007f;">script</span>.*(\&gt;|%3E) [NC]<br /> <span style="color: #00007f;">RewriteRule</span> .* /injectlog.php [L,QSA]</p>
<p>Hier wird anstatt den Verdächtigen einen Block vor die Nase zu setzen die Anfrage 1:1 an injectlog.php weitergeleitet, dieses Script ist natürlich mit der ersten Version erst mal ein Proof of Concept. Es besteht die Möglichkeit a) die Angriffe lokal zu protokolieren, dieses Protokoll beinhaltet Uhrzeit &amp; Datum, IP des Angreifers, Requestmethode (GET/POST), Aufgerufene Datei, den Query String und den User Agent (Browser)</p>
<p>Zu dem Lokalem Logfile gibt es noch, der eigentlichen Idee entsprechend, die Möglichkeit das ganze in eine Datenbank zu submitten. Wie gesagt, erstmal proof of concept, die DB wird später natürlich öffentlich verfügbar sein da diese Daten ja doch für den ein oder anderen Webentwickler recht interessant sein können. Aus dem Grund der Öffentlichkeit werden auch nicht alle Daten übermittelt, in späteren Script Versionen könnte man das optional einstellbar gestalten. Derzeit wird bei einem Submit in die Datenbank nur die Version des Scripts, Request Methode, Aufgerufene Datei, Query String und der User Agent übermittelt.</p>
<p>Die Installation ist simpel, einfach die injectlog.php in das root dir der Webseite kopieren und die obige htaccess Anweisung in die eigene .htaccess Datei einfügen.</p>
<h4>Der Quelltext</h4>
<p>Das Projekt ist nun auf einer Extra Seite ausgegliedert, weitere Informationen gibt es unter <a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2Fid2Voci5zb2xhcml6LmRl">abwehr.solariz.de</a></p>
 <img src="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=696" width="1" height="1" style="display: none;" /> <p><a href="http://solariz.de/?flattrss_redirect&amp;id=696&amp;md5=fee151d2d3b830ef166de8d27527592b" title="Flattr" target="_blank"><img src="http://solariz.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://solariz.de/696/injection-log-und-block.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="http://solariz.de/?flattrss_redirect&amp;id=696&amp;md5=fee151d2d3b830ef166de8d27527592b" type="text/html" />"
	</item>
		<item>
		<title>Hotlink Protection via .htaccess Howto</title>
		<link>http://solariz.de/648/hotlink-protection-via-htaccess-howto.htm</link>
		<comments>http://solariz.de/648/hotlink-protection-via-htaccess-howto.htm#comments</comments>
		<pubDate>Thu, 20 Mar 2008 18:26:50 +0000</pubDate>
		<dc:creator>solariz</dc:creator>
				<category><![CDATA[Tool Box]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[Howto]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://new.solariz.de/648/hotlink-protection-via-htaccess-howto.htm</guid>
		<description><![CDATA[<h3>Was zur Hölle ist Hotlinking ?</h3>
<div id="scid:887EC618-8FBE-DEAD-BEEF-2339AF2EC721:73764afc-d2c1-4b32-9bfc-4d358f651034" class="wlWriterSmartContent" style="margin: 0px; padding: 0px; display: inline; float: right;"><a class=\"highslide\" onclick=\"return hs.expand(this)\" href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5zb2xhcml6LmRlL2ltYWdlcy9zdG9yaWVzL2hvdGxpbmtfb2huZS04eDYucG5n"><img src="http://www.solariz.de/images/stories/hotlink_ohne_7.png" border="0" alt="" /></a></div>
<p>&#8230;wird sich der ein oder andere &#8211; zu recht- fragen. Nun unter &#8220;Hotlinking&#8221; versteht man das fremde verlinken von Inhalten, in diesem Fall eben Bildern. Das Web besteht heutzutage zu großen teilen aus Bilder und Videos oder besser gesagt Multimedialen Inhalten. Diese treiben natürlich auch den Traffic in die Höhe. Wenn man nicht den Luxus hat auf Traffic kein Auge werfen zu müssen so kann es sich schnell bemerkbar machen wenn die eigenen Bilder bei der Google Bildersuche hoch gerankt werden. Dies bedeutet jede Menge Traffic ohne wirklich an der Seite interessierte Personen mit zu bringen.</p>
<p>Aber auch bei Seitenbetreibern die nicht nach &#8220;Traffic == Geld&#8221; gehen kann es unerwünscht sein wenn Fremde Webseiten &#8230;</p>]]></description>
			<content:encoded><![CDATA[<h3>Was zur Hölle ist Hotlinking ?</h3>
<div id="scid:887EC618-8FBE-DEAD-BEEF-2339AF2EC721:73764afc-d2c1-4b32-9bfc-4d358f651034" class="wlWriterSmartContent" style="margin: 0px; padding: 0px; display: inline; float: right;"><a class=\"highslide\" onclick=\"return hs.expand(this)\" href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5zb2xhcml6LmRlL2ltYWdlcy9zdG9yaWVzL2hvdGxpbmtfb2huZS04eDYucG5n"><img src="http://www.solariz.de/images/stories/hotlink_ohne_7.png" border="0" alt="" /></a></div>
<p>&#8230;wird sich der ein oder andere &#8211; zu recht- fragen. Nun unter &#8220;Hotlinking&#8221; versteht man das fremde verlinken von Inhalten, in diesem Fall eben Bildern. Das Web besteht heutzutage zu großen teilen aus Bilder und Videos oder besser gesagt Multimedialen Inhalten. Diese treiben natürlich auch den Traffic in die Höhe. Wenn man nicht den Luxus hat auf Traffic kein Auge werfen zu müssen so kann es sich schnell bemerkbar machen wenn die eigenen Bilder bei der Google Bildersuche hoch gerankt werden. Dies bedeutet jede Menge Traffic ohne wirklich an der Seite interessierte Personen mit zu bringen.</p>
<p>Aber auch bei Seitenbetreibern die nicht nach &#8220;Traffic == Geld&#8221; gehen kann es unerwünscht sein wenn Fremde Webseiten sich mit den eigenen Bildern oder schlimmer Videos schmücken. Dies gilt es hier nun mit einfachen Mitteln zu unterbinden.</p>
<h3>Der Apache dein Freund und Helfer</h3>
<div id="scid:887EC618-8FBE-DEAD-BEEF-2339AF2EC721:e5aeaf28-3e75-4e0d-9118-7c9b846f28ee" class="wlWriterSmartContent" style="margin: 0px; padding: 0px; display: inline; float: right;"><a rel=\"lightbox\" href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5zb2xhcml6LmRlL2ltYWdlcy9zdG9yaWVzL2hvdGxpbmtfbWl0LTh4Ni5wbmc="><img src="http://www.solariz.de/images/stories/hotlink_mit_10.png" border="0" alt="" /></a></div>
<p>Wie so viele im World Wide Web setze ich auch auf den Apache als Webserver. Daher beschränke ich das Tutorial darauf.<br /> Nun wie in der ersten Grafik zu sehen ist es ja immer der User Browser der die Daten bei unserem Webserver anfordert, nicht die fremde Webseite selbst. Daher ist es ein falscher Lösungsansatz die IP der fremden Seite zu blocken. Dies bringt uns in diesem Vorhaben nicht zum Ziel. Die Fremdseite stellt unser Bild oder unseren Multimedia Inhalt also z.B. via normalem IMG tag da. Also  Der &#8220;Trick&#8221; ist nun einfach den vom Browser übermittelten Referer auszulesen und diesen auszuwerten. Im normalfall sollte dieser entweder a) leer sein oder b) die Domain unserer eigenen Seite enthalten. Alles andere wären unerwünschte Anforderungen. Klar ist dies nicht die ultimative Sicherheit da einige Software Produkte die sich &#8220;Internet Security Lösungen&#8221; schimpfen eine Funktion haben den Referer zu filtern. Dies hilft aber dem Betreiber der fremden Webseite nichts da er in der Regel nicht davon ausgehen kann das alle seine Besucher solch eine Software verwenden.</p>
<p>Wie in Bild #2 zu sehen ist, übernimmt unser Webserver hier nun die Filterarbeit. Wenn ein &#8220;Fremder&#8221; verweis erkannt wird haben wir nun die Möglichkeit diesen einfach zu unterbinden oder alternativ einfach etwas anderes zurück zu liefern. Entscheiden wir uns für zweites würde der Besucher der fremden Seite anstatt des schönen Fotos nun nur noch ein Bild mit der Aufschrift &#8220;Dieser Aufruf ist nicht gestattet, besuchen sie MeineSeite.de&#8221; Blöd für den Betreiber. Nun bleibt ihm nur die Möglichkeit das Bild zu kopieren und auf seinem Webserver zu packen womit er sofern ich dies nicht ausdrücklich erlaube allerdings eine schwerwiegende Copyright Verletzung eingeht.</p>
<p>Nun gibt es aber jedoch auch gute Hotlinker im Internet die man gewähren lassen möchte, dies sind z.B. Seiten eines Kollegen oder eine weitere Homepage von einem selbst oder auch Image Indexer wie z.B. Google Bildersuche. Dies müssen wir dann als Ausnahme genehmigen.</p>
<p>Als einfaches Beispiel für oben genanntes lässt sich eine Hotlink Protection wie folgt erzeugen. Man fügt im Verzeichnis in dem auf der eigenen Webseite die Bilder liegen eine .htaccess datei ein und ergänzt diese mit der Anweisung:</p>
<p> ### HOTLINK PROTECTION<br /> RewriteEngine on<br /> RewriteCond %{HTTP_REFERER} .<br /> RewriteCond %{HTTP_REFERER} !^<a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovLyhbXi5dKy4pP3d3Y2w=">http://([^.]+.)?wwcl</a>. [NC]<br /> RewriteCond %{HTTP_REFERER} !^<a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovLyhbXi5dKy4pP3djZy1ldXJvcGU=">http://([^.]+.)?wcg-europe</a>. [NC]<br /> RewriteCond %{HTTP_REFERER} !^<a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovLyhbXi5dKy4pP3BsYW5ldGxhbi1nbWJo">http://([^.]+.)?planetlan-gmbh</a>. [NC]<br /> RewriteCond %{HTTP_REFERER} !^<a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovLyhbXi5dKy4pP2RjbW0=">http://([^.]+.)?dcmm</a>. [NC]<br /> RewriteCond %{HTTP_REFERER} !^<a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovLyhbXi5dKy4pP251eG51eA==">http://([^.]+.)?nuxnux</a>. [NC]<br /> RewriteCond %{HTTP_REFERER} !^<a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovLyhbXi5dKy4pP3NvbGFyaXo=">http://([^.]+.)?solariz</a>. [NC]<br /> RewriteCond %{HTTP_REFERER} !^<a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovLyhbXi5dKy4pP3BsYW5ldGxhbg==">http://([^.]+.)?planetlan</a>. [NC]<br /> RewriteCond %{HTTP_REFERER} !^<a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovLyhbXi5dKy4pP21heGdh">http://([^.]+.)?maxga</a>. [NC]<br /> RewriteCond %{HTTP_REFERER} !^<a href="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovLyhbXi5dKy4pP2xvY2FsaG9zdA==">http://([^.]+.)?localhost</a> [NC]<br /> RewriteCond %{HTTP_REFERER} !google. [NC]<br /> RewriteCond %{HTTP_REFERER} !search?q=cache [NC]<br /> RewriteCond %{REQUEST_URI} !^/stophotlink.gif$<br /> RewriteRule .(gif|jpg|png)$ /stophotlink.gif [NC,L]</p>
<p> Wie man sieht sind  hier 11 Seiten als Ausnahme definiert. Alles andere wird umgeleitet auf die Datei stophotlink.gif</p>
<p>Viel Spaß damit.</p>
 <img src="http://solariz.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=648" width="1" height="1" style="display: none;" /> <p><a href="http://solariz.de/?flattrss_redirect&amp;id=648&amp;md5=42757ad09cd9d14fcee6b62641a7c8ee" title="Flattr" target="_blank"><img src="http://solariz.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://solariz.de/648/hotlink-protection-via-htaccess-howto.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="http://solariz.de/?flattrss_redirect&amp;id=648&amp;md5=42757ad09cd9d14fcee6b62641a7c8ee" type="text/html" />"
	</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using apc
Database Caching 5/28 queries in 0.010 seconds using apc
Object Caching 724/767 objects using apc
Content Delivery Network via cdn.solariz.de

Served from: solariz.de @ 2012-02-04 22:37:15 -->
