Das Putzlowitsch Test- und SEO-Blog

WordPress mit Permalinks – den Webserver entlasten

Wie WordPress Permalinks verarbeitet

Durch Permalinks bekommen Artikel und Seiten lesbare URLs und auch Struktur. Alle Artikel in der Kategorie ‚Wordpess‘ können mit schnurpsel.de/themen/wordpress/ aufgerufen werden, das Monatsarchiv für Juli 2010 mit schnurpsel.de/date/2010/07/.

Auf dem Webserver existiert aber kein Verzeichnis /themen/wordpress/ oder /date/2010/07/. Damit die Seiten trotzdem aufgerufen werden können, erstellt WordPress eine einfache Regel für das Rewrite-Modul des Apache-Webservers:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Diese drei Zeilen führen dazu, das alles, was nicht tatsächlich als Datei oder Verzeichnis auf dem Server existiert, einfach an die index.php von WordPress durchgereicht wird. WordPress kümmert sich nun darum, ob es z.B. eine Kategorie „WordPress“ gibt, stellt die Liste mit den passenden Artikeln zusammen und gibt sie aus.

Was es alles nicht gibt

Im Moment sind wohl mal wieder ein paar Bots oder Skriptkiddies unterwegs, die einfach versuchen, irgendwelche php-Skripte aufzurufen, um mögliche Sicherheitslücken ausnutzen zu können. Das sieht dann etwa so aus:

/scripts/setup.php
/pma/scripts/setup.php
/phpMyAdmin/scripts/setup.php
/phpmyadmin/scripts/setup.php
/myadmin/scripts/setup.php

Solche Dateien gibt es hier allerdings nicht. Auch andere Sachen können zu fehlerhaften Aufrufen führen, z.B. Standard-Icons wie favicon.ico oder apple-touch-icon.png, die manche Browser einfach aufrufen oder durch Nutzer aus der Bildersuche falsch kopierte BILd-URLs.

Durch die für die Permalinks notwendigen mod_rewrite-Regeln werden alle dies Aufrufe nun an WordPress weitergeleitet. WordPress wird geladen, stellt eine Datenbankverbingung her, klappert die internene Rewriteregeln ab um schließlich nur festzustellen, daß es mit dem Aufruf nichts anfangen kann. Dann gibt WordPress schließlich auch nur eine Fehlerseite aus, die möglicherweise auch noch aufwändig gestaltet ist und unnötig viel Daten als Antwort zurücküberträgt.

WordPress und den Webserver entlasten

Damit nun nicht WordPress wegen jeder Kleinigkeit behelligt werden, kann man eine spezielle Regel der WordPress-Regel vorschalten, die einfach gegebenfalls die Abarbeitung der Rewrite-Regeln beendet:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.[^\.]+$ - [L]
</IfModule>

Die Idee dabei ist, daß alle Permalink-URLs normalerweise keine Dateierweiterung wie .html, .jpg oder .php haben. Falls nun eine Datei nicht existiert (RewriteCond) und diese Datei mit einem Punkt und mindestens einem weiteren Zeichen endet, wird die Abarbeitung der Regeln an dieser Stelle beendet (RewriteRule). Diese Zeilen müssen vor den WordPress-Regeln stehen.

WordPress bekommt diese Aufrufe nicht mehr zu sehen, der Fehler wird einfach vom Webserver behandelt. Hier kommt dann auch eine konfigurierte und vorhanden benutzerdefinierte Fehlerseite zu Anwendung.

Ich weiß, es gibt auch Blogger, die aus welchen Gründen auch immer, die Permalinks mit einem abschließenden .html konfiguriert haben. Aber auch das ist kein Problem, es muß nur eine Zeile hinzugefügt werden, welche die Regel für die Endung .html (oder eine andere) ungültig macht:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI}	!\.html$
RewriteRule \.[^\.]+$ - [L]
</IfModule>

Optimierte Version

Mann kann die zusätzlichen Bedingungen auch direkt in die WordPress-Rules einfügen. Nachteil hierbei ist aber, daß sie bei Änderungen an den Permalinkeinstellungen verloren gehen, weil WordPress den Block zwischen # BEGIN WordPress und # END WordPress neu schreibt:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}	!\.[^\.]+$
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Die Version mit Endung .html:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}	!\.[^\.]+$ [OR]
RewriteCond %{REQUEST_URI}	\.html$
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Plugin-Version

Angeregt durch die Kommentare von Ralf habe ich nun eine Plugin-Version fertig gestellt.

Download: 123 Rewrite Error 0.10

Das Plugin schreibt die Regeln beim Aktivieren, Deaktivieren und bei Änderungen an der Permalinkstruktur wie bei der Optimierten Version beschrieben automtisch mit den WordPress-RewriteRules in die .htaccess. Dabei wird auch gleich berücksichtigt, ob in der Permalinkstruktur eine Erweiterung wie .html angegeben wurde.

Fazit

Wieviel Serverlast oder Traffic durch diese Maßnahme eingespart wird, kann ich nicht sagen. Das hängt sicher auch vom Nutzungsprofil und der Konfiguration der Website ab. Aber warum sollte man solch eine einfache Möglichkeiten auslassen, um WordPress und dem Webserver das Leben ein bißchen leichter zu machen.

8 Kommentare »

WordPress Shortlink für Bilder

Seit es Twitter und anderen Kurznachrichtendienste gibt, sind kurze URLs sehr wichtig geworden. Bei Wordperess sind Shortlinks schon lange quasi „ab Werk“ eingebaut. Man muße einfach nur die Artikel-ID als Parameter p mit der Seite aufrufen (putzlowitsch.de/?p=1649).

Das funktioniert auch für Attachments wie Bilder, Sounds und sonstige Dateien, die über WordPress hochgeladen und mit der Mediathek verwaltet werden. Allerdings wird hier nicht auf die Datei selbst, sondern auf die Attachment-Seite weitergeleitet (putzlowitsch.de/?p=1650).

Um nun auch direkt auf Dateien shortlinken zu können, sind nur ein paar Zeilen PHP-Code notwendig. Ich habe dafür als Alternative zum Parameter p wie Post den neuen Parameter a wie Attachment eingeführt. Der Aufruf erfolgt dann mit putzlowitsch.de/?a=1650. Die Funktionen habe ich in ein kleines Plugin gepackt, wem zu viele Plugins nicht gefallen, kann auch einfach den Quelltext in der Datei functions.php seines Themes einfügen:

function plw123as_redirect_canonical( $redirect_url, $requested_url ) {
	global $wp_query;
	
	if( isset($wp_query->query_vars['a']) ) {
		$id = intval( $wp_query->query_vars['a'] );
		$url = wp_get_attachment_url( $id );
		if( '' == $url ) {
			$wp_query->set_404();
			status_header( 404 );
			$redirect_url = false;	
		}
		else
			$redirect_url = $url;	
	}
	return $redirect_url;
}

function plw123as_init() {
 global $wp;

 // Variable bekannt machen
 $wp->add_query_var( 'a' );
 add_filter( 'redirect_canonical', 'plw123as_redirect_canonical', 10, 2 );
}
add_action( 'init', 'plw123as_init' );

 
Download: 123 Attachment Shortlink 0.10

Ich wurde übrigens so ein bißchen von der Statusupdate mit Bildern-Sache zu diesem kleinen PHP-Code angeregt. Kann ja nicht sein, das ich für direkte Links auf Bilder elendig lange URLs verwenden muß. :-)

Nachtrag 16:30 Uhr
Google-Statusupdates - Bilder kein Redirect

Leider wertet die Googlesuche nach Statusupdates eine Weiterleitung auf ein Bild nicht als Bild selbst. Die Bild-URL wird zwar aufgelöst, das Bild aber nicht angezeigt. Schade! Vielleicht ändert sich das ja noch…

Nachtrag 17:45 Uhr
Hmmm, scheint doch mit den weitergeleiteten Bildern bei Google-Statusupdates zu funktionieren, aber nicht immer oder nur manchmal, keine Ahnung…

Keine Kommentare »

Was bringen Links in Image-Maps?

Html Image Map

Eine verweis-sensitive Grafik (Image Map) ermöglicht es dem Webdesigner nicht nur ein komplettes Bild mit einem Link zu verknüpfen, sondern Teilbereiche des Bildes anklickbar zu machen und mit unterschiedlichen Links zu hinterlegen. Damit bringt es ihm und den Seitenbesuchern schon mal einen Mehrwert an Gestaltungs- bzw. Auswahlmöglichkeiten.

Links im Map für Suchmaschinen interessant?

Es stellt sich mir jedoch die Frage, und diese möchte ich hiermit an Kundige weitergeben, ob die Suchmaschinen diese Links in Maps überhaupt erfassen, berücksichtigen und werten. Ich weiß es ehrlich gesagt nicht. Man könnte nun mal wieder ein Experiment starten, aber vielleicht kennt sich damit ja einer meiner Leser aus und es ist kein großes Geheimnis.

Interessant ist auch die Frage, wie Image-Map und Image aus Sicht der Suchmaschine zusammenwirken. Werden die Alt- bzw. Titeltexte vom Map an das Bild und umgekehrt „vererbt“? Was passiert, wenn ein map quasi unbenutzt in der Luft hängt, also gar nicht von einem Bild mit usemap referenziert wird? Falls das keine Rolle spielt, könnte man damit ja schöne, unsichtbare Linklisten erzeugen. :-)

iPhone4Spiel Top-Ten jetzt anklickbar

Die iPhone4Spiel Top-10-Grafiken sind jetzt per Image-Map anklickbar geworden. Bei der normalen Top-Ten führt der Klick natürlich zur Seite selbst. Bei der Bilder-Top-Ten werden aber nicht die Bilder selbst verlinkt, sondern die Zielseiten, von denen sie referenziert, also wo sie angezeigt werde.

Was bringt das nun? Nicht wirklich viel, aber ich wollte einfach die „programmtechnische Herausforderung“ meistern, zu einem dynamisch generierten Bild auch eine dynamisch generierte Image-Map zu erstellen. :-)

2 Kommentare »

my-hacks.php wird auch in WordPress 3.0 noch unterstützt

Puhhh, Glück gehabt. Nachdem bereits mit WordPress 2.8 die Option für die my-hacks.php aus dem Backend verschwunden war, hatte ich befürchtet, daß auch die Unterstützung für diese älteste WordPress-Erweiterungs-Schnittstelle ab WordPress 3.0 ganz unter den Tisch fallen würde.

Das scheint aber nicht der Fall zu sein, denn in WP 3.0 RC1 wird die my-hacks.php weiterhin geladen, sofern sie aktiviert ist. Damit ist gewährleistet, daß nicht plötzlich nach dem Update wichtige Funktionen ausgesperrt werden, die möglicherweise in der my-hacks.php stehen.

Allerdings kann man nach einer Neuinstalltion die my-hacks-Erweiterung nicht mehr im Backend aktivieren. Dafür müßte man direkt in der Datenbank rumfummeln oder man verwendet das „123 Hackfile Option“-Plugin:

Download: Plugin 123 Hackfile Option 0.12

Die Option dafür erscheint nun allerdings nicht mehr bei Einstellungen->Verschiedenes (gibt es nicht mehr), sondern ganz am Ende von Einstellungen->Allgemein.

Keine Kommentare »