Das Putzlowitsch Testblog für alles mögliche
Thema: Tips & Tricks

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 un 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 /
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 /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}	!\.[^\.]+$ [OR]
RewriteCond %{REQUEST_URI}	\.html$
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

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.

4 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 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…

0 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. :-)

0 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.

0 Kommentare »

Die gute, alte Rechtsklick-Sperre

Javascript Rechtsklick-Sperre

Sie sind zwar nur noch selten anzutreffen, halten sich aber hartnäckig, die Javascript-Rechtsklicksperren. Dabei sind sie praktisch wirkungslos, nur noch absolute Computerlaien lassen sich damit verblüffen. Und dann will da jemand auch noch Sachen damit “schützen”, die er selbst nur von einer anderen Seite “geklaut” hat. *tststs*

0 Kommentare »

Ein nacktes Wordpress installieren

Wordpress-Installation

Eine neue Wordpressinstallation enthält üblicherweise bereits ein paar Beispieldaten. So sind schon eine Seite und ein Artikel mit einem Kommentar vorhanden, etwa wie dieser hier. Die Blogrolle ist auch schon mit ein paar Links gefüllt.

Wenn man das nicht möchte, weil man beispielsweise einen Wordpress-Export (per WP-Export als xml) importieren möchte und die IDs der Artikel und Seiten erhalten bleiben sollen, kann man eine benutzerdefinierte Installation verwenden.

Wordpress lädt am Anfang der Installation die Datei wp-content/install.php, falls sie vorhanden ist. In dieser kann man einige Installationsfunktionen “überschreiben”. Das funktioniert so wie bei den Funktionen aus der pluggable.php im Verzeichnis wp-includes. Wordpress prüft, ob eine Funktion bereits vorhanden ist:

if ( !function_exists('wp_install') ) :
 ...
endif;

Falls nicht, wird die Wordpress-Funktion “installiert”, andernfalls wird die bereits vorhandene verwendet. Die wordpresseigenen Installationsfunktionen findet man in wp-admin/includes/upgrade.php, diese kann man sich als Vorlage für eigene Modifikationen hernehmen.

Wordpress ohne “Hallo Welt”

Um nun eine leere Wordpress-Installation zu erhalten, wird die Funktion wp_install_defaults in der Datei wp-content/install.php neu definiert:

<?php
function wp_install_defaults($user_id) {
}
?>

Es ist einfach eine leere Funktion, dadurch wird aber auch keine Default-Kategorie für Artikel und Links erstellt. Möchte man die Standardkategorien trotzdem haben, nimmt man den oberen Teil aus der originalen WP-Funktion (bis // Now drop in some default links) in die eigene Funktion mit rein. Dabei das global $wpdb nicht vergessen.

Wie man auf diese Weise bereits Plugins bei der Installation aktivieren kann, hatte ich früher schon mal beschrieben.

Nachdem die Anpassungen in der install.php vorgenommen wurden und diese in das Wordpress-Content-Verzeichnis kopiert wurde, kann man die Wordpressinstallation wie gewohnt starten.

0 Kommentare »