<?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>toscho.design&#187; Interna</title>
	<atom:link href="http://toscho.de/thema/interna/feed/" rel="self" type="application/rss+xml" />
	<link>http://toscho.de</link>
	<description>Redaktion und schwer geprüftes Webdesign aus Halle (Saale)</description>
	<lastBuildDate>Thu, 17 May 2012 23:03:08 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>daily</sy:updatePeriod>
	<sy:updateFrequency>4</sy:updateFrequency>
	
		<item>
		<title>Der 90-Tage-Spamstopper</title>
		<link>http://toscho.de/2012/90-tage-spamstopper/</link>
		<comments>http://toscho.de/2012/90-tage-spamstopper/#comments</comments>
		<pubDate>Sun, 26 Feb 2012 18:55:06 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Interna]]></category>
		<category><![CDATA[Spam]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1840</guid>
		<description><![CDATA[Wie ich mein Spamvolumen dramatisch reduziert habe. Ohne Plugin. Vorerst.]]></description>
			<content:encoded><![CDATA[<p>Vor ein paar Tagen schlugen hier viele Kommentare ein, die zwar nichts beworben, aber dennoch nur aus Unsinnstext bestanden. Der Spamfilter hat sie nicht erwischt, also kamen sie erstmal durch. Lästig für mich, richtig ärgerlich für die Abonnenten einiger Artikel. Sorry Leute!</p>
<p>Ich habe jetzt die Kommentare für alle Artikel abgeschaltet, die älter sind als 90 Tage. Das hat mein Spamvolumen von etwa 250 pro Tag auf <strong>Null</strong> gesenkt. Ja genau: Seit drei Tagen hatte ich keinen einzigen Spamkommentar mehr. Fantastisch.</p>
<p>Leider ist die Regel ein bißchen dumm: Sinnvoller wäre ein Abschalten 90 Tage nach der letzten Aktivität. Wenn ich also einen Artikel aktualisiere oder eine Diskussion läuft, dann sollten die Kommentare offen bleiben.</p>
<p>Da ich ein sehr verwandtes Plugin bereits als Konzept stehen habe – es soll Artikel nach eben diesem Kriterium auf der Startseite sortieren – packe ich das dann zusammen. Bis dahin … bleibt es so, wie es jetzt ist.</p>
<p>Dennoch traurig, welchen Einfluß auf die eigene Seite man Arschlöchern einräumen muß.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2012/90-tage-spamstopper/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Dezentraler Pragmatismus</title>
		<link>http://toscho.de/2012/dezentraler-pragmatismus/</link>
		<comments>http://toscho.de/2012/dezentraler-pragmatismus/#comments</comments>
		<pubDate>Sun, 01 Jan 2012 15:03:17 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Interna]]></category>
		<category><![CDATA[Kunterlei]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1820</guid>
		<description><![CDATA[Mehr Text, weniger Qualität: Start eines neuen Experiments in Reaktion auf die dezentrale Diskussionskultur.]]></description>
			<content:encoded><![CDATA[<p>Anfang Dezember hat <a href="http://bueltge.de">Frank</a> auf Google+ auf <a href="http://molily.de/">Mathias Schäfers</a> <a href="http://www.webkrauts.de/2011/12/05/sass-compass2/">Artikel zu Sass und Compass</a> <a href="https://plus.google.com/111291152590065605567/posts/LKpTjT7DcDu">hingewiesen</a>. Das haben wir gleich dort lebhaft diskutiert. <a href="http://grochtdreis.de/">Jens Grochtdreis</a> bedauerte später, daß die Diskussion auf Google+ stattfand und nicht im Blog. Meine Antwort:</p>
<blockquote><p>Wichtiger als der Ort der Diskussion ist doch, daß sie überhaupt passiert. Google+ verdeutlicht eben, daß die Idee der zentralen oder kontrollierten Debatte obsolet geworden ist.</p>
<p>Das war schon vorher so, jetzt merkt man es nur besser.</p>
</blockquote>
<p>Warum haben wir nicht im Blog diskutiert? Ich kann nicht für andere sprechen, meine Gründe waren recht einfach:</p>
<ul>
<li>Nach dem ersten Kommentar auf G+ entstand eine Folge von Beiträgen, die auf <strong>vorhergehende reagiert</strong> haben. Man kann nicht sinnvoll irgendwann ins Blog wechseln und dort auf Kommentare in G+ reagieren.</li>
<li>Auf G+ läuft die Kommunikation viel <strong>schneller</strong>. Ja, das Interface ist Scheiße, die Formatierung Glückssache und die Permalinks bestenfalls Schrott. Die Suche funktioniert nicht, das ist schließlich bloß Google. Aber die Antworten kommen schneller, und ich erfahre sofort von ihnen, weil ich keine umständliche Einwilligungsprozedur für entsprechende Hinweise durchlaufen muß.</li>
<li>In einem Blog hat man als Kommentator viel stärker das Gefühl, <strong>kontrolliert</strong> zu werden. Zwar sperrt auch Google immer noch einzelne Nutzer sehr willkürlich, aber einzelne Beiträge werden nur selten gelöscht. Postautoren, die ihnen nicht genehme Kommentare löschen, werden automatisch und zu Recht als Arschlöcher betrachtet. In einem Blog ist das <a href="http://toscho.de/2010/kommentare-moderieren-richtlinien/" title="Wie und warum ich Kommentare moderiere">etwas anders</a>.</li>
</ul>
<p>Alle drei Kriterien sind schwer objektiv meßbar, keines <em>erzwingt</em> einen Diskussionsort. Ich glaube, daß sie relevanter werden, je mehr sich die Interfaces sozialer Netzwerke verbessern.</p>
<p>Für Autoren heißt das: Sie verlieren mehr und mehr Einfluß auf den Ort der Debatte. Oft <em>erfahren</em> sie nicht einmal davon. Das hat schon mit Twitter angefangen. Allerdings kann man dort nur in Fragmenten reden, Diskussionen verpuffen sehr schnell, und sie erreichen nie die Tiefe wie auf Google+.</p>
<p>Okay, alles recht banal. Warum schreibe ich das auf? Weil ich gerade mein Blog inspiziere und sehe: Sieben Artikel im letzten Jahr. Dabei habe nicht weniger geschrieben, eher mehr. Aber eben dort, wo ich mit schnellen Reaktionen rechne: Auf Google+ und <a href="http://wordpress.stackexchange.com">WordPress.StackExchange</a>. Im Blog lege ich mehr Wert auf die Qualität der Artikel. Vielleicht zu viel?</p>
<p>Wenn die Diskussion an vielen Orten passieren kann, dann kann ich auch meine Texte an vielen Orten publizieren. Ich kümmere mich weniger um <a href="http://support.google.com/webmasters/bin/answer.py?hl=de&#038;answer=66359">Duplicate content</a> als um die Reichweite meiner Ideen.</p>
<p>Ich werde künftig mehr experimentieren – dazu habe ich das Blog ja eingerichtet. Also werdet ihr hier bald mehr Schnipsel lesen, Unfertiges, das ich allmählich überarbeite, Fertiges, das ich andernorts schon geschrieben habe, und bloße Konzepte für Artikel. Das wird mich einige Überwindung kosten.</p>
<p>Nun will ich nicht einfach das Blog füllen. Ich möchte auch die Leser erreichen, die nicht in den gleichen Netzwerken agieren wie ich, und die nicht gerne englische Texte lesen – meine sind ohnehin oft nicht der reine Genuß. Auch muß ein Text nicht sofort perfekt sein; ich kann und darf ihn irgendwann verbessern.</p>
<p>Das Risiko für mich dabei: Ich kann mich blamieren, weil ich nicht genügend recherchiert habe, weil ich mich schlicht irre oder Seiten von mir zeige, die ihr nicht mögt. So sei es.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2012/dezentraler-pragmatismus/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Das falsche Gebot</title>
		<link>http://toscho.de/2010/das-falsche-gebot/</link>
		<comments>http://toscho.de/2010/das-falsche-gebot/#comments</comments>
		<pubDate>Fri, 24 Sep 2010 16:31:40 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Interna]]></category>
		<category><![CDATA[Kunterlei]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1726</guid>
		<description><![CDATA[Eine unheilige Geschichte aus der fernsten Gegenwart über unmoralische Angebote und den Umgang zwischen Kunden und Auftragnehmern.]]></description>
			<content:encoded><![CDATA[<p>Es ist noch nicht lang genug her, da war ich nur ein kleiner Wicht. Ich saß da und wollte, daß man mich will. Ich litt Hunger und Angst und Zweifel.</p>
<p>Dann bat mich einer: Schreib ein Gebot für ein Projekt. Und ich schrieb, und ich hoffte, und er wollte mich nicht: Später! Vielleicht! Heute nicht.</p>
<p>Das tat weh.</p>
<p>Dann sagte doch einer zu, und ich tat meine Arbeit, und ich tat sie gut. Und der Mann zog los und sprach zu den Leuten: Seht her, der tut Gutes! Und die Leute kamen und fragten und sagten zu.</p>
<p>Das tat gut.</p>
<p class="wideimg"><a href="http://www.flickr.com/photos/backpackphotography/244716694/"><img src="http://toscho.de/wp-content/uploads/2010/09/devils-tower-at-sunrise.jpg" alt="" title="Devil’s Tower at sunrise von backpackphotography" width="640" height="427" class="aligncenter size-full wp-image-1727" /></a></p>
<p>Jetzt bin ich ein großer Wicht, und die Leute fragen immer noch, und ich sage ab. Manchmal.</p>
<p>Das tut mir leid.</p>
<p>Jüngst fragte mich einer, und ich sagte ab, und es tat mir leid. Doch er bat: So schreib ein falsches Gebot! Wir haben schon einen, nur unsere Bücher wollen zwei. Fürchte den Auftrag nicht. Du kriegst ihn nie.</p>
<p><strong>Lieber Kunde,</strong> wenn du denkst, ein Gebot koste nicht Mühe noch Zeit, so denke noch einmal. Und sagt dir jemand, ein Handel sei frei von Moral, so gehe hin, und steinige ihn.</p>
<p>Das tut Not.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/das-falsche-gebot/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Kommentare moderieren: Meine Richtlinien</title>
		<link>http://toscho.de/2010/kommentare-moderieren-richtlinien/</link>
		<comments>http://toscho.de/2010/kommentare-moderieren-richtlinien/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 11:09:22 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Interna]]></category>
		<category><![CDATA[Sprache]]></category>
		<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1646</guid>
		<description><![CDATA[Meine Kriterien zum Löschen und Bearbeiten der Kommentare. Ja, die dürfen kommentiert werden!]]></description>
			<content:encoded><![CDATA[<p>Ich halte die Kommentare in diesem Blog für ebenso wichtig wie meine Artikel. Mag die Diskussion mal das ursprüngliche Thema verlassen – stört mich nicht. Doch wenn sie von Backlinkjunkies zerfasert wird, schreite ich ein.</p>
<p>Den klassischen Spam für Mädels oder Hilfsmittel, um sie zu beeindrucken, fängt der <a href="http://toscho.de/2010/spam-verhindern-akismet-htaccess/">automatische Filter</a> ab. Kein Problem.</p>
<p>Für den Rest habe ich ein paar Kriterien gefunden, die mich zum Löschen bewegen:</p>
<ul>
<li>Offensichtliche <strong>SEO-Namen:</strong> Firmen- oder Berufsbezeichnungen, auch als angebliche Namensteile. Das schwimmt natürlich: Kurt Schuster nehme ich noch hin, Klara Modevertrieb hingegen … kann mich mal.</li>
<li><strong>E-Mail-Adressen</strong> in der Art <samp>pr@example.comn</samp>. Solche Leute gibt es tatsächlich. Internetversteher.</li>
<li>Kommentare mit Backlinks auf <strong>verdächtige Seiten:</strong> Hätte ich dahin freiwillig einen Link gesetzt? Nein? Weg damit! Steck dir deine Spartricks, deine Cycle-Page und dein Spamblog bitte dorthin, wo es wehtut.</li>
<li>Alle paar Wochen schreibt hier auch jemand mit einem wechselnden Frauennamen: Der Inhalt ist <em>gerade so</em> etwas zu lang für Spam und hat <em>gerade so</em> noch einen Bezug zum Artikel. Die verlinkte Website könnte man <em>gerade so</em> noch durchgehen lassen.<br />
Kindchen, ich bin Autor! Ich erkenne dich unter <em>jedem</em> Namen wieder, und wenn ich überhaupt ein Talent habe, dann für das Erkennen von Sprachmustern. Dafür habe ich sogar ein gutes Gedächtnis. Das hätte ich gerne woanders …</li>
</ul>
<p>Manche Kommentare kennzeichne ich <em>nicht als Spam,</em> aber ich entferne sie zugunsten der allgemeinen Übersicht:</p>
<ul>
<li>Nackte <strong>Ichbotschaften:</strong> »Kannte ich noch nicht.«, »Probier ich mal.« und Ähnliches. Benutz’ einen <a href="http://toscho.de/2010/webdesign-fuers-ipad/" title="Der teuerste Spiegel aller Zeiten: das iPad.">Spiegel</a>.</li>
<li>Nur <strong>»Danke!«</strong> Ich freue mich, wenn ich dir geholfen habe, und ich <em>brauche</em> auch ein wenig Anerkennung. Allerdings stelle ich die Bedürfnisse meiner Leser in diesem Punkt über meine eigenen.<br />
Mit einer E-Mail oder einer Empfehlung in deinem Blog kannst du mir das Lächeln auch zurückgeben, das ich dir hoffentlich entlockt habe.</li>
<li>Völlig <strong>sachfremde Fragen oder Hinweise,</strong> die keinen Bezug zum Artikel oder zu einem anderen Kommentar herstellen. Wenn ich sie dennoch interessant finde, melde ich mich bei dir per E-Mail.</li>
<li>Kommentare, die sich auf gelöschte Kommentare beziehen. Da bitte ich dich um Nachsicht.</li>
<li>Beschimpfungen und andere juristische Fallgruben. Dafür gibt’s das Heise-Forum.</li>
</ul>
<p>Natürlich kann ich mich auch irren. Also hebe ich einen manuell entfernten Kommentar <em>eine Woche</em> auf. Meldet sich der Autor nicht binnen dieser Zeit, lösche ich den ganzen Eintrag.</p>
<p>Bei manchen Kommentaren nehme ich nur einen Link heraus, ohne die Aussage zu zerstören, wenn ich ihn für fragwürdig halte oder das Ziel nicht mehr existiert. </p>
<p>Insgesamt werde ich künftig etwas strenger urteilen, denn meine Nachsicht ist in den letzten Wochen ein paar Mal zu oft ausgenutzt worden.<br />
Das ging so weit, daß folgende zwei Zeilen in meine <code>.htaccess</code> Einzug fanden:</p>
<pre class="notranslate">RewriteCond <var>%{HTTP_REFERER}</var> do-follow-blogs\.de
RewriteRule ^ http://www.do-follow-blogs.de/ [L,R=301]</pre>
<p>Wenn du dich zu Unrecht wegmoderiert siehst, dann schreib mir eine freundliche E-Mail. Wenn du aber weißt, daß du Spam geschrieben hast, dann geh Sterben.</p>
<h2>Weiterschmökern</h2>
<ul>
<li><a href="http://toscho.de/2010/wordpress-moderationslinks-fuer-kommentare/">WordPress: Moderationslinks für Kommentare</a></li>
<li><a href="http://toscho.de/2010/informieren-statt-sperren/">Informieren statt Sperren</a></li>
<li><a href="http://toscho.de/2009/wordpress-moderationsfalle-offenlegen/">WordPress: Moderationsfalle offenlegen</a></li>
<li><a href="http://toscho.de/2009/blocken-mit-htaccess/">Ungebetene Gäste mit .htaccess blocken</a></li>
<li><a href="http://toscho.de/2009/no-no-no-nofollow/">No no no nofollow</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/kommentare-moderieren-richtlinien/feed/</wfw:commentRss>
		<slash:comments>34</slash:comments>
		</item>
		<item>
		<title>WordPress: Moderationslinks für Kommentare</title>
		<link>http://toscho.de/2010/wordpress-moderationslinks-fuer-kommentare/</link>
		<comments>http://toscho.de/2010/wordpress-moderationslinks-fuer-kommentare/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 20:58:09 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Interna]]></category>
		<category><![CDATA[Markup]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1671</guid>
		<description><![CDATA[Wie man jeden Kommentar um Links ergänzt, die beim Verwalten helfen. Mit vollständigem PHP- und CSS-Code.]]></description>
			<content:encoded><![CDATA[<p>Trotz des <a href="http://toscho.de/2010/spam-verhindern-akismet-htaccess/">Antispam-Plugins</a> schlüpft auch hier manchmal ein Müllkommentar durch den Filter, oder ich vertippe mich … für diese Fälle bietet WordPress an, Kommentare zu bearbeiten, als Spam zu markieren oder ganz zu löschen. Im Backend.</p>
<p>Das ist mir ein wenig zu umständlich; deshalb habe ich in meiner Klasse ›XWP‹, die zusätzliche Templatetags erzeugt, folgenden kleinen Schnipsel eingebaut, den ich <a href="http://yoast.com/wordpress-functions-supercharge-theme/" hreflang="en">von Joost de Valk abgeguckt</a> habe:</p>
<pre class="notranslate">    <i>/* Generates comment moderation links.
     *
     * @author Joost de Valk
     * @link   <a href="http://yoast.com/wordpress-functions-supercharge-theme/">http://yoast.com/wordpress-functions-supercharge-theme/</a>
     * @param  int <var>$id</var> Comment id - use get_comment_ID()
     * @return void
     */</i>
    public static function delete_comment_link(<var>$id</var>)
    {
        if ( ! <a href="http://codex.wordpress.org/Roles_and_Capabilities#moderate_comments">current_user_can</a>('<code class="string">moderate_comments</code>') )
        {
            return;
        }

        global <var>$post</var>;

        <var>$redirect</var> = get_permalink( <var>$post</var>-&gt;ID );

        <var>$links</var> = array (
            '<code class="string">delete</code>'  =&gt; '<code class="string">cdc</code>',
            '<code class="string">spam</code>' =&gt; '<code class="string">cdc&amp;dt=spam</code>',
            '<code class="string">edit</code>' =&gt; '<code class="string">editcomment</code>'
        );

        <var>$return</var> = '<code class="string">&lt;span class="comment_admin"&gt;</code>';

        foreach ( <var>$links</var> as <var>$name</var> =&gt; <var>$param</var> )
        {
            <var>$return</var> .= "<code class="string">&lt;a href='</code>"
                    . admin_url("<code class="string">comment.php?c=<var>$id</var>&amp;action=<var>$param</var>&amp;redirect_to=<var>$redirect</var></code>")
                    . "<code class="string">'&gt;<var>$name</var>&lt;/a&gt;</code>";
        }

        print <var>$return</var> . '<code class="string">&lt;/span&gt;</code>';

        return;
    }</pre>
<p>In der <code>comments.php</code> rufe ich die Funktion innerhalb des Kommentarloops auf:</p>
<pre class="notranslate">XWP::delete_comment_link( get_comment_ID() );</pre>
<p>Das erzeugt etwa dieses <a href="http://toscho.de/thema/markup/">Markup</a>:</p>
<pre class="notranslate">&lt;span class="<code class="string">comment_admin</code>"&gt;
  &lt;a href='<code class="string">/wp-admin/comment.php?c=905&amp;action=cdc&amp;redirect_to=/2010/beispiel/</code>'
     &gt;delete&lt;/a&gt;
  &lt;a href='<code class="string">/wp-admin/comment.php?c=905&amp;action=cdc&amp;dt=spam&amp;redirect_to=/2010/beispiel/</code>'
     &gt;spam&lt;/a&gt;
  &lt;a href='<code class="string">/wp-admin/comment.php?c=905&amp;action=editcomment&amp;redirect_to=/2010/beispiel/</code>'
     &gt;edit&lt;/a&gt;
&lt;/span&gt;</pre>
<p>Mit ein wenig <a href="http://toscho.de/thema/css/">CSS</a> aufgepeppt …</p>
<pre class="notranslate">.comment_admin
    {
        float:              right;
        font:               .9em/1 Calibri;
        text-align:         center;
    }
.comment_admin a
    {
        color:              #444;
        background:         #f9f9f9;
        text-decoration:    none;
        border:             1px solid #bbb;
        border-radius:      4px;
        box-shadow:         0 2px 3px rgba(0,0,0,0.2);
        display:            inline-block;
        width:              3em;
        margin:             4px;
        padding:            4px 15px;
    }
#content .comment_admin a:hover
    {
        background:         #666;
        color:              #fff;
        border:             1px solid #222;
    }</pre>
<p>… sieht das Ergebnis dann so aus:</p>
<p><img src="http://toscho.de/wp-content/uploads/2010/04/comment-moderation.png" alt="" title="comment moderation" width="280" height="123" class="alignnone size-full wp-image-1672 border" /></p>
<p>Nach einem Klick landet man in der Bearbeitungsmaske im Backend, <em>dann erst</em> wird der Kommentar per Knopfdruck gelöscht oder als Spam markiert.</p>
<p>Mehr so’n Zeug:</p>
<ul>
<li><a href="http://toscho.de/2009/wordpress-administrator-php-herausfinden/">Administrator mit PHP herausfinden</a></li>
<li><a href="http://toscho.de/2009/wordpress-moderationsfalle-offenlegen/">Moderationsfalle offenlegen</a></li>
<li><a href="http://toscho.de/2009/no-no-no-nofollow/">No no no nofollow</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/wordpress-moderationslinks-fuer-kommentare/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>CSS: Knapp, frisch und lange haltbar</title>
		<link>http://toscho.de/2010/css-knapp-frisch-lange-haltbar/</link>
		<comments>http://toscho.de/2010/css-knapp-frisch-lange-haltbar/#comments</comments>
		<pubDate>Sat, 24 Apr 2010 09:59:28 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Interna]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[htaccess]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1662</guid>
		<description><![CDATA[Wie ich die Ladezeit meiner Stylesheets beschleunigt habe: Mit einer Subdomain, ein bißchen mod_rewrite, ETag, Expires und Kompression.]]></description>
			<content:encoded><![CDATA[<!--TOC-->
<p>Vor einiger Zeit habe ich mal <a href="http://toscho.de/2008/frisches-layout/" title="Frisches Layout vom 23.12.2008">gezeigt</a>, wie man mittels eines UNIX-Timestamps in der Adresse dem Browser immer das aktuelle Stylesheet darbietet:</p>
<pre style="clear:none;max-width:30em;">&lt;link
  rel="<code class="string">stylesheet</code>"
  media="<code class="string">screen,projection</code>"
  href="<code class="string">/wp-content/themes/toscho/css?d=1229632675</code>"
  title="<code class="string">screen+projection</code>"
  type="<code class="string">text/css</code>"
></pre>
<p><a href="http://www.flickr.com/photos/yomi955/1254934058/"><img src="http://toscho.de/wp-content/uploads/2010/04/fresh-tomato-yomi955-b.jpg" alt="Tomaten" title="Fresh Tomato von yomi955" width="500" height="375" class="alignnone size-full wp-image-1663" /></a></p>
<h2>Nachteile der alten Variante</h2>
<p>Das Grundprinzip verwende ich immer noch, aber im Zuge des <a href="http://toscho.de/2010/interna-layout-4-0/" title="Interna: Layout 4.0">letzten Redesigns</a> habe ich es um ein paar Nuancen verfeinert. An der alten Variante haben mich nämlich einige Dinge gestört:</p>
<ul>
<li>Ich mußte den Cache des Clients immer <a href="http://github.com/toscho/PHP-HTTP-Tools/blob/master/class.HTTP_Response.php" title="PHP-Klasse HTTP_Response">per PHP validieren</a>, was unnötig Zeit kostet.</li>
<li>Die resultierende URL sieht lang und umständlich aus. Durch das Fragezeichen darin fühlten sich nicht alle Browser zum Cachen angeregt.</li>
<li>Das Stylesheet mußte unter dem selben Host liegen wie das Theme, was parallele Requests erschwert.</li>
</ul>
<h2>Umzug auf die Subdomain</h2>
<p>Nun habe ich hier noch eine ungenutzte Domain herumliegen – mundonaut.de –, auf der mein Bruder eigentlich ein bißchen bloggen wollte. Oder sollte.<br />
Trotz Prüfungen, Umzug und Magisterarbeit hat er das bis heute seltsamerweise nicht geschafft, und so gammelte die Domain nur so vor sich hin. Schade.</p>
<p>Ich habe dort jetzt eine Subdomain angelegt: <a href="http://t4.mundonaut.de/">t4.mundonaut.de</a>, auf der ich alle kleinen Dateien für dieses Theme parke: Bilder, Javascripte und Stylesheets.</p>
<p>Die können jetzt von den Browsern <strong>parallel</strong> zu dieser Seite und ihren Inhaltsbildern heruntergeladen werden, die nur wenige Verbindungen pro Host öffnen – IE 7 beispielsweise nur zwei. Außerdem exisitieren für die Subdomain <strong>keine Cookies</strong>; das reduziert auch den HTTP-Overhead ein wenig.</p>
<h2>Schöner Dateiname</h2>
<p>Den UNIX-Timestamp habe ich vom Parameter in den <strong>Dateinamen</strong> verlegt. Die neue Adresse des Stylesheets – ich benutze jetzt nur noch eines für alle Medientypen und eins für alte Internet Explorer – sieht nun beispielsweise so aus:</p>
<pre class="notranslate">http://t4.mundonaut.de/1271536949.css</pre>
<p>Den lokalen Dateipfad habe ich fest ins Theme geschrieben; mittels <a href="http://php.net/filemtime">filemtime()</a> erzeuge ich den passenden Namen.</p>
<p>In der <a href="http://t4.mundonaut.de/.htaccess">.htaccess der Subdomain t4</a> lenke ich die Anfragen dann auf die jeweils passende Datei:</p>
<pre class="notranslate"><i># Ein UNIX-Timestamp enthält genau 10 Ziffern: \d{10}</i>
RewriteEngine On
RewriteRule ^\d{10}\.css main.css [L]
RewriteRule ^\d{10}\.ie\.css ie.css [L]</pre>
<p>Jetzt kümmert sich der Server um die Validierung des Client-Caches; der macht das natürlich viel schneller als ich.</p>
<h2>Kompression</h2>
<p>Auch die übernimmt der Server. Bei meinem Webhoster <a href="https://all-inkl.com/">all-inkl.com</a> ist die <strong>Kompression für Textdateien</strong> ohnehin schon angeschaltet; auch darum muß ich mich nicht mehr kümmern. Müßte ich es, so verwendete ich <a href="http://httpd.apache.org/docs/2.2/mod/mod_deflate.html">mod_deflate</a>:</p>
<pre class="notranslate">AddOutputFilterByType DEFLATE text/plain text/css</pre>
<p>Der Apache speichert das Ergebnis; so hält sich die Mehrarbeit in engen Grenzen.</p>
<p>Lokal komprimiere ich das Stylesheet vor: Ich entferne unnötige Leerzeichen, Zeilenumbrüche und Kommentare. Für das Script gibt es auch eine Weboberfläche im Labor: <a href="http://labs.toscho.de/css-compressor/">CSS Compressor</a>.</p>
<h2>ETag</h2>
<p>Damit die Cache-Validierung <a href="#comment-2629" title="Im Kommentar erklärt">besser klappt</a>, habe ich noch <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19">ETags</a> aktiviert:</p>
<pre class="notranslate">FileETag MTime Size</pre>
<p><strong>Obacht!</strong> Ältere Apachen (vor Version 2.2.12) <a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=39727#c22">erzeugen einen kaputten ETag</a> für automatisch komprimierte Dateien. Der sieht dann so aus:</p>
<pre class="notranslate">ETag: "47b5361382042"-gzip</pre>
<p>Damit kann man den Cache des Clients bestenfalls <em>verhindern</em>. Ich habe All-Inkl darauf hingewiesen – und einen Tag darauf hatte ich einen aktualisierten Server. Das nenne ich Service.</p>
<h2>Expires</h2>
<p>Als Sahnehäubchen gibt es noch eine <a href="http://httpd.apache.org/docs/2.2/mod/mod_expires.html" title="mod_expires">ausgedehnte Verfallszeit</a>:</p>
<pre class="notranslate"><i># Lang lebe euer Cache!</i>
ExpiresActive On
ExpiresByType image/png                <code class="string">"access plus 1 year"</code>
ExpiresByType image/jpeg               <code class="string">"access plus 1 year"</code>
ExpiresByType image/gif                <code class="string">"access plus 1 year"</code>
ExpiresByType image/x-icon             <code class="string">"access plus 1 year"</code>
ExpiresByType image/icon               <code class="string">"access plus 1 year"</code>
ExpiresByType application/x-javascript <code class="string">"access plus 3 months"</code>
ExpiresByType text/css                 <code class="string">"access plus 3 months"</code></pre>
<h2>Nachteile der neuen Variante</h2>
<p>Das Theme ist jetzt fest an diese Domain gebunden und nicht mehr portabel. Das spielt hier keine Rolle; aber wer Themes schreibt, deren Einsatzort unbekannt ist, kann damit wenig anfangen.</p>
<p>Die ETag-Direktive kann nur bei einem halbwegs aktuellen Server benutzt werden, und mod_rewrite braucht man auch.</p>
<p>Andererseits läßt sich das Verfahren auf <em>jedes</em> Layout übertragen, ob es nun von WordPress erzeugt wird oder nicht.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/css-knapp-frisch-lange-haltbar/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>jQuery: Interne Sprungziele anbieten</title>
		<link>http://toscho.de/2010/jquery-interne-sprungziele-anbieten/</link>
		<comments>http://toscho.de/2010/jquery-interne-sprungziele-anbieten/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 00:24:58 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Interna]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Trickkiste]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1647</guid>
		<description><![CDATA[Wie man interne Anker mittels jQuery herausstellt und anklickbar macht.]]></description>
			<content:encoded><![CDATA[<!--TOC-->
<p>Meine Leidenschaft gilt dem Subtilen, dem unaufdringlichen Detail. Deshalb fange ich leere Suchanfragen ab, oder ich vergrößere die Eingabefelder im Kommentarformular, sobald sie fokussiert werden.</p>
<p>Heute habe noch so ein Detail nachgerüstet. Wenn ich einen Artikel mittels Überschriften in mehrere Abschnitte eingeteilt habe, dann lasse ich per <a href="http://scott.yang.id.au/code/toc-generator/" title="WordPress-Plugin: Table of Contents Generator" hreflang="en">Plugin</a> ein Inhaltsverzeichnis erstellen. Dabei werden alle Überschriften mit einer <code>id</code> versehen, die dann als Sprungziel dient. Bis hierhin nichts Neues; so verfahre ich schon lange. Heute aber habe ich den Nutzwert der <code>id</code>-Attribute erhöht.</p>
<p class="wideimg"><a href="http://www.flickr.com/photos/rakfb/2421927874/"><img src="http://toscho.de/wp-content/uploads/2010/04/anchor-rakfb-500.jpg" alt="Anker" title="Anker von rafk" width="500" height="188" class="size-full wp-image-1648" /></a></p>
<h2>CSS pur – nur für Auserwählte</h2>
<p>In <a href="http://toscho.de/2010/css-mein-userstylesheet/">meinem Userstylesheet</a> lasse ich mir interne Anker gerne zeigen:</p>
<pre class="notranslate">h1[id]:hover:after,
h2[id]:hover:after,
h3[id]:hover:after,
h4[id]:hover:after,
h5[id]:hover:after,
h6[id]:hover:after
    { <i>/* Findet interne Links, falls ich mal auf
       einen Abschnitt in einer Seite linken will. */</i>
        content:            " #" attr(id);
        font:               bold 14px/1 Consolas;
    }</pre>
<p>Das könnte ich hier auch einbauen. Leider hat aber Mozilla an dieser Stelle einen <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=12460" title="Bug 12460 - Cannot select or edit or search generated content and alt text" hreflang="en">unangenehmen Bug</a>, der erst zehneinhalb Jahre alt ist und deshalb noch nicht repariert wurde: <i lang="en">Generated Content</i> kann nicht kopiert werden. Ihr sähet also einen Text, den ihr nicht erreichen könnt. So etwas biete ich nicht an.</p>
<h2>Javascript macht’s möglich</h2>
<p>Zu den vielen <a href="http://molily.de/js/bibliotheken.html#vorteile-nachteile">Vorteilen eines Javascript-Frameworks</a> gehört, daß ich mich um die Bugs und Besonderheiten der einzelnen Browser kaum noch kümmern muß. Seit dem letzten <a href="http://toscho.de/2010/interna-layout-4-0/">kleinen Redesign</a> setze ich hier <a href="http://jquery.com/">jQuery</a> ein, und damit läßt sich das Problem sehr elegant lösen.</p>
<p>Man kann in jQuery meistens ganz normale CSS-Selektoren benutzen, um Elemente auszuwählen. Beispielsweise füllt <code>jQuery('<code class="string">h2[id], h3[id]</code>')</code> einen Array mit allen Überschriften zweiter und dritter Ordnung, die ein Attribut <code>id</code> besitzen.</p>
<p>Mit <a href="http://api.jquery.com/each/"><code>each()</code></a> schlendert man dann gemütlich jeden Treffer ab und löscht, ersetzt oder bearbeitet ihn, bis die Finger bluten. Und das mache ich jetzt auch:</p>
<pre class="notranslate">&lt;script defer&gt;
jQuery(document).<a href="http://api.jquery.com/ready/">ready</a>(function hpoint()
{
    jQuery('<code class="string">h2[id], h3[id]</code>').<a href="http://api.jquery.com/each/">each</a>(function jumplink()
    {
        <i>// Klasse setzen</i>
        jQuery(this).<a href="http://api.jquery.com/addClass/">addClass</a>('haslink');
        <i>// Link ankleben</i>
        jQuery(this).<a href="http://api.jquery.com/append/">append</a>(
            '&amp;#160;&lt;a class="hpoint noprint" href="#'
            + jQuery(this).<a href="http://api.jquery.com/attr/">attr</a>("id")
            + '" title="Direkter Link auf diese Position"&gt;#&lt;/a&gt;'
        );
    });
});
&lt;/script&gt;</pre>
<p>Jetzt haben also alle anspringbaren Überschriften einen Link, mit dem jeder etwas anfangen kann.</p>
<h2>CSS zur Feinarbeit</h2>
<pre class="notranslate">.hpoint:link,
.hpoint:visited
    {
        color:              #ccc;
        text-decoration:    none;
    }
.haslink:hover .hpoint,
.haslink:focus .hpoint,
.haslink:target .hpoint
    {
        color:              #059;
    }</pre>
<p>Das Script sollte irgendwo am Ende der Seite stehen oder ausgelagert werden. jQuery selbst muß natürlich vorher eingebunden werden.</p>
<p>Wie findet ihr das? Lästig, nützlich, oder verbesserungsbedürftig?</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/jquery-interne-sprungziele-anbieten/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Interna: Layout 4.0</title>
		<link>http://toscho.de/2010/interna-layout-4-0/</link>
		<comments>http://toscho.de/2010/interna-layout-4-0/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 11:02:41 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Interna]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Kommentare]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1641</guid>
		<description><![CDATA[Ich habe eine Menge Details verbessert: Grafiken, CSS und die Kommentare.
Hier stelle ich alles einzeln vor, und ich bitte um Rückmeldungen.]]></description>
			<content:encoded><![CDATA[<p>Ich sage es gerne und darob immer wieder: Eine Website ist kein Zustand, sondern ein Prozeß. <em>Diese</em> Website verstehe ich vor allem als technische Spielwiese für Experimente, die ich bei meinen Kunden noch nicht wage; also gilt hier sowieso nichts als ›fertig‹.</p>
<p>Vorletzte Nacht habe ich eine Version meines Themes hochgeladen, die gleich ein ganzes Rudel kleiner Schliffe eingeführt hat:</p>
<ul>
<li>Die Kopfgrafik kann niemand mehr als ›tote Katze‹ interpretieren. Auch das Favicon habe ich erneuert.</li>
<li>Das Stylesheet für Handhelds und ähnliche Kleingeräte habe ich entsorgt. Mein normales Layout paßt sich von allein an, und es brauchte nur wenige kleine Schubser, um auf einem schmalen Bildschirm gut auszusehen. Wieder einen Request gespart.</li>
<li>In einem großen Fenster wird der Inhaltsblock nun zentriert. Ich muß nicht verstehen, warum jemand seinen Browser weiter als 1200 Pixel aufzieht – aber ich akzeptiere das Bedürfnis, in diesem Fall lieber geradeaus zu sehen als nach links.</li>
<li>Das Theme unterstützt endlich auch <a href="http://justintadlock.com/archives/2009/11/16/everything-you-need-to-know-about-wordpress-2-9s-post-image-feature">Vorschaubilder</a>; das werde ich künftig intensiver nutzen.</li>
<li>Das Suchfeld wird bei <code>:focus</code> deutlicher hervorgehoben.</li>
<li>Navigation und Fußzeile haben jetzt kein eigenes Hintergrundbild mehr.</li>
<li>Das Hintergrundbild für den <code>body</code> habe ich zunächst umgedreht; langfristig liebäugele ich aber wieder mit einer ›Tapete‹, auch wenn das nicht jeder mag.</li>
<li>Ich habe viele Tricks aus der <code>functions.php</code> in ein eigenes Plugin ausgelagert. Dazu schreibe ich demnächst mal etwas.</li>
<li>Die neuen Kommentare werden auf <em>jeder</em> Archivseite dargestellt. Dafür kommen sie aus dem Cache. Auch dazu werde ich bald sehr ausführlich schreiben.</li>
<li>Die Überschriften der Archive zeigen die Zahl der Artikel <em>insgesamt</em> an, nicht nur die der jeweiligen Seite.</li>
<li>Auf der Seite ›<a href="http://toscho.de/uebersicht/alle-artikel/">Alle Artikel</a>‹ habe ich die Vorschau etwas verbessert. Einfach mal mit der Maus drüberfahren … die Tastaturbedienung bedarf noch ein wenig mehr Arbeit.</li>
<li>Im <code>head</code> gibt es auch einen Feed für <a href="http://delicious.com/toscho">meine Lesezeichen</a>; das habe ich mir bei <a href="http://sprungmarker.de/">Sylvia Egger</a> abgeguckt.</li>
<li>Die wichtigste und bislang noch ganz unsichtbare Neuerung: Gastautoren werden endlich angemessen herausgestellt. Warum das so wichtig ist, seht ihr bald.</li>
</ul>
<p>Links alt, rechts neu:</p>
<div><img src="http://toscho.de/wp-content/uploads/2010/04/toscho-theme-3.0.png" alt="Screenshot der Version 3" title="Theme 3.0" width="300" height="225" class="size-full wp-image-1642" /> <img src="http://toscho.de/wp-content/uploads/2010/04/screenshot.png" alt="Screenshot der Version 4" title="Theme 4.0" width="300" height="225" class="size-full wp-image-1643" /></div>
<p>Bestimmt habe ich nicht nur Probleme gelöst, sondern auch neue eingeführt – bitte weist mich darauf hin! Und wenn noch etwas offen ist, das ihr gerne anders hättet, dann habt sagt es bitte jetzt.</p>
<p>Außerdem suche ich noch nach einem leichtgewichtigen Script, das mit MooTools oder jQuery arbeitet und Tabellen schnell sortieren kann. Und zwar auch mit deutschem Datum und verlinkten Inhalten. Vorschläge?</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/interna-layout-4-0/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>WordPress und .htaccess: Request säubern</title>
		<link>http://toscho.de/2010/wordpress-htaccess-request-saeubern/</link>
		<comments>http://toscho.de/2010/wordpress-htaccess-request-saeubern/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 14:29:08 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Interna]]></category>
		<category><![CDATA[Suchmaschinen]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[HTTP]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1638</guid>
		<description><![CDATA[Wie man per mod_rewrite überflüssige Querystrings entfernt und die Adressen für Archive standardisiert.]]></description>
			<content:encoded><![CDATA[<p><img src="http://toscho.de/wp-content/uploads/2010/03/wp-htaccess-150.png" alt="WordPress .htaccess" width="150" height="150" class="alignright size-full wp-image-1688" /></p>
<p>WordPress erlaubt ja sehr <a href="http://toscho.de/2009/beste-url-struktur/">flexible Permalinks</a>. Dazu schreibt man sich dieses in die .htaccess:</p>
<pre class="notranslate"><span class="tag">&lt;<a href='http://www.google.com/search?q=IfModule+%22Version+2.2%22+-%22List-Post%22+site:httpd.apache.org&amp;num=50&amp;ie=utf-8'>IfModule</a> mod_rewrite.c&gt;</span>
    <a class='directive' href='http://www.google.com/search?q=RewriteEngine+%22Version+2.2%22+-%22List-Post%22+site:httpd.apache.org&amp;num=50&amp;ie=utf-8'>RewriteEngine</a> On
    <a class='directive' href='http://www.google.com/search?q=RewriteBase+%22Version+2.2%22+-%22List-Post%22+site:httpd.apache.org&amp;num=50&amp;ie=utf-8'>RewriteBase</a> /
    <a class='directive' href='http://www.google.com/search?q=RewriteCond+%22Version+2.2%22+-%22List-Post%22+site:httpd.apache.org&amp;num=50&amp;ie=utf-8'>RewriteCond</a> <var>%{REQUEST_FILENAME}</var> !-f
    RewriteCond <var>%{REQUEST_FILENAME}</var> !-d
    <a class='directive' href='http://www.google.com/search?q=RewriteRule+%22Version+2.2%22+-%22List-Post%22+site:httpd.apache.org&amp;num=50&amp;ie=utf-8'>RewriteRule</a> . /index.php <span class="flag">[L]</span>
<span class="tag">&lt;/IfModule&gt;</span></pre>
<p>Allerdings finde ich diese Regeln noch zu großzügig; sie verhindern nicht folgende Probleme:</p>
<ul>
<li>Archive können um die Kette <code>00/</code> ergänzt werden.<br />
<code>http://example.com/2009/00/</code> liefert ganz normalen Inhalt aus; <code>http://example.com/0/</code> ebenso.</li>
<li>Manch externe Software »veredelt« gesetzte Links gerne um Trackingparameter in der Annahme, jeder verwende Google-Analytics.<br />
Twitterlinks beispielsweise bekommen ungefragt den Querystring <code>?utm_source=twitterfeed&#038;utm_medium=twitter</code> angehängt, und FeedBurner klebt ein <code>?utm_source=feedburner&#038;utm_medium=feed&#038;utm_campaign=Feed:+wdrss+(WDRSS)</code> an. Das nimmt WordPress einfach so hin.</li>
<li>Und dann gibt es noch die Spinner, die in den Parameter <code>p</code>, der eigentlich nur numerische Werte empfängt, etwas ganz anderes hineinpacken, eine URL etwa. Auch hier reagiert WordPress nicht.</li>
<li>Schließlich generiert WordPress für Archive, die geblättert werden, URLs in der Form <code>/2009/page/3/</code>.<br />
<code>/2009/page/1/</code> liefert leider denselben Inhalt wie <code>/2009/</code>, und wenn jemand eine Ebene hochklettert (dafür habe ich eine <a href="http://toscho.de/2009/vereinfachte-mausgesten-fuer-opera/">Mausgeste</a>), dann wirft <code>/2009/page/</code> nur eine wenig hilfreiche Fehlermeldung aus.</li>
</ul>
<p>Mehrere Adressen für eine Ressource wollen wir nicht. Und <a href="http://toscho.de/2009/htaccess-angriffe-sehen-blockieren/">404-Meldungen</a> sind für kaputte Crawler, nicht für richtige, wertvolle Besucher.</p>
<p>Wir werfen also den ursprünglichen WordPress-Eintrag raus und <strong>ersetzen</strong> ihn durch diesen:</p>
<pre class="htaccess"><span class="tag">&lt;<a href='http://www.google.com/search?q=LimitExcept+%22Version+2.2%22+-%22List-Post%22+site:httpd.apache.org&amp;num=50&amp;ie=utf-8'>LimitExcept</a> HEAD GET POST&gt;</span>
    <a class='directive' href='http://www.google.com/search?q=order+%22Version+2.2%22+-%22List-Post%22+site:httpd.apache.org&amp;num=50&amp;ie=utf-8'>order</a> deny,allow
    <a class='directive' href='http://www.google.com/search?q=deny+%22Version+2.2%22+-%22List-Post%22+site:httpd.apache.org&amp;num=50&amp;ie=utf-8'>deny</a> from all
<span class="tag">&lt;/LimitExcept&gt;</span>

<a class='directive' href='http://www.google.com/search?q=RewriteEngine+%22Version+2.2%22+-%22List-Post%22+site:httpd.apache.org&amp;num=50&amp;ie=utf-8'>RewriteEngine</a> On
<a class='directive' href='http://www.google.com/search?q=RewriteBase+%22Version+2.2%22+-%22List-Post%22+site:httpd.apache.org&amp;num=50&amp;ie=utf-8'>RewriteBase</a> /

<i># Catch obstrusive tracking parameters like ...</i>
<i># ?utm_source=twitterfeed&amp;utm_medium=twitter or</i>
<i># ?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed:+wdrss+(WDRSS)</i>
<i># ... because they generate doubled content.</i>
<a class='directive' href='http://www.google.com/search?q=RewriteCond+%22Version+2.2%22+-%22List-Post%22+site:httpd.apache.org&amp;num=50&amp;ie=utf-8'>RewriteCond</a> <var>%{QUERY_STRING}</var> utm_source= <span class="flag">[NC,OR]</span>
<i># Some people put their own URIs into this parameter. May be better banned.</i>
RewriteCond <var>%{QUERY_STRING}</var> ^p=\D
<i># The question mark removes the query string.</i>
<a class='directive' href='http://www.google.com/search?q=RewriteRule+%22Version+2.2%22+-%22List-Post%22+site:httpd.apache.org&amp;num=50&amp;ie=utf-8'>RewriteRule</a> (.*) /$1? <span class="flag">[L,R=301]</span>

<i># WordPress allows URLs like /2010/0/ or /00/ == doubled content</i>
RewriteRule (^0+|(.*)/0+)/$ /$2 <span class="flag">[L,R=301]</span>

<i># WordPress: paged content creates a /page/</i>
RewriteRule (^p|(.*)/p)age/(1/)?$ /$2 <span class="flag">[L,R=301]</span>

<i># Fix double slashes redirect /a///b to /a/b
# <a href="http://toscho.de/2009/wordpress-2-8-3-das-doppelslash-problem/">http://toscho.de/2009/wordpress-2-8-3-das-doppelslash-problem/</a></i>
RewriteCond <var>%{THE_REQUEST}</var> ^[A-Z]+\ /(([^/\ ]+/)*)/+([^\ ]*)
RewriteRule ^ /%1%3 <span class="flag">[L,R=301]</span>

<i># Images, Stylesheets etc.</i>
RewriteCond <var>%{REQUEST_URI}</var> !.+\.\w{2,4}$
<i># Existing file</i>
RewriteCond <var>%{REQUEST_FILENAME}</var> !-f
<i># Existing directory</i>
RewriteCond <var>%{REQUEST_FILENAME}</var> !-d
<i># Symbolic link</i>
RewriteCond <var>%{REQUEST_FILENAME}</var> !-l
RewriteRule ^ index.php <span class="flag">[L]</span>
</pre>
<p>Mein Dank geht an <a href="http://frncs.co/">Francesco Schwarz</a> (<a title="Francesco Schwarz auf Twitter" href="http://twitter.com/isellsoap/">@isellsoap</a>) für seine ausführlichen Tests.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/wordpress-htaccess-request-saeubern/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Piwik: Verirrte Requests abfangen</title>
		<link>http://toscho.de/2010/piwik-verirrte-requests-abfangen/</link>
		<comments>http://toscho.de/2010/piwik-verirrte-requests-abfangen/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 16:15:59 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Interna]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[piwik]]></category>
		<category><![CDATA[rewrite]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1636</guid>
		<description><![CDATA[Manche Crawler finden die piwik.php nicht. Denen kann man mit mod_rewrite helfen. ]]></description>
			<content:encoded><![CDATA[<p>Aus der tragischen Lage, vor lauter Arbeit nicht mehr bloggen zu können, vermögen mich offenbar nur noch kaputte Crawler herauszureißen. So beobachte ich immer mal wieder Requests auf Artikel mit dem Anhängsel <code>/piwik.php</code>:</p>
<pre class="notranslate">GET http://toscho.de/kontakt/piwik.php</pre>
<p>Der User-Agent dazu ist entweder der Crawler von <a href="http://www.archive.org">archive.org</a> …</p>
<pre class="notranslate">ia_archiver (+<a href="http://www.alexa.com/site/help/webmasters">http://www.alexa.com/site/help/webmasters</a>; crawler@alexa.com)</pre>
<p>… oder jemand, der das zumindest behauptet:</p>
<pre class="notranslate">Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; +http://www.archive.org)</pre>
<p>Im zweiten Fall gehört die IP-Adresse jedoch einer ›HCL Technologies (MASS) Inc.‹, bei der ich zunächst keine Nähe zu archive.org erkennen kann. Der Crawler interpretiert auch gerne mal einen kompletten Absatz als URL … das werde ich mit strengem Blick verfolgen.</p>
<p>Egal. Ich sende beide per Bannstrahl alias <a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html">mod_rewrite</a> auf die richtige Adresse meiner <a href="http://toscho.de/2009/piwik-ueberblick-installation/">Piwik-Installation</a>:</p>
<pre class="notranslate"><i># Stupid piwik.php requests</i>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^p\.toscho\.de$
RewriteRule piwik\.php$ http://p.toscho.de/piwik.php [L,R=301]</pre>
<p>Wer diese Requests nicht mitloggen möchte, kann die letzte Zeile auch ersetzen durch:</p>
<pre class="notranslate">RewriteRule piwik\.php$ - [G]</pre>
<h2>Bonustip</h2>
<p>Piwik zeigt ab Werk die Ergebnisse des letzten Tages an. Das kann man in der <code>config.ini</code> anpassen. Da steht bei mir unter anderem:</p>
<pre class="notranslate">[General]
<strong>default_day             = "<code class="string">today</code>"</strong>
datatable_default_limit = 20</pre>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/piwik-verirrte-requests-abfangen/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Database Caching using disk: basic
Object Caching 622/739 objects using disk: basic

Served from: toscho.de @ 2012-05-21 15:45:02 -->
