webconsul

the best webconsul(ting)

howto: Indizierung und Status der eigenen Seiten überwachen

Sie sind hier: Startseite » Webserver

Heute gab es in der Facebook-Gruppe SEO Tools die Frage wie man einfach prüfen kann, ob die Google Crawler eine Seite erreichen und indizieren können.

Dazu gibt es viele kommerzielle Lösungen, aber als Techniker gibt es eine einfache dazu.

Mit der PHP-Implementierung von cURL kann man einige gute Sachen machen, nützlicherweise auch genau dies. Man fordert eine entfernte Webseite an und lässt sich die Reponsezeiten, den Status und mehr Daten ausgeben. Als Skript sieht das ganze so aus:


<style>
*{font:15px/18px "Lucida Grande","Lucida Sans Unicode",Arial,Verdana,sans-serif;}
th,td{padding:2px}
</style>
<table cellpadding="0" cellspacing="1" class="weiss abst">
<tr valign="top" class="hgrau1">
<th>URL</th>
<th>Status</th>
<th>Transaktionszeit</th>
<th>Verbindungszeit</th>
<th>Größe</th>
</tr>
<?php

function curlfetch($url) {
$c = curl_init($url);
curl_setopt($c, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1");
curl_setopt($c, CURLOPT_REFERER, 'http://www.onvista.de/');
curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($c, CURLOPT_HEADER, 0);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
$r = curl_exec($c);

echo "<tr>
<td>". curl_getinfo($c, CURLINFO_EFFECTIVE_URL) ."</td>
<td>". curl_getinfo($c, CURLINFO_HTTP_CODE) ."</td>
<td>". curl_getinfo($c, CURLINFO_TOTAL_TIME) ."</td>
<td>". curl_getinfo($c, CURLINFO_CONNECT_TIME) ."</td>
<td>". curl_getinfo($c, CURLINFO_SIZE_DOWNLOAD) ."</td>
</tr>";
}

$urls = array(
'http://www.webconsul.de/',
'http://www.google.de/',
'http://www.heise.de/',
''
);

for($i=0; $i < sizeof($urls); $i++) {
curlfetch($urls[$i]);
}
?>
</table>

Das Skript gibt es zum Kopieren hier: www.webconsul.de/status.txt

Alle weiteren Daten die cURLs curl_getinfo() hergibt können verwendet werden, die ganze Liste gibt es hier: php.net curl_getinfo().

Bei Fragen einfach in die Kommentare und SEOs die gutes Tun können hier klicken.

Apache 2.4 – Mach dem Webserver Beine!

Sie sind hier: Startseite » Webserver

Es ist soweit! Unser neuer SEO-Freund Apache 2.4 ist da!

Viele der neuen Funktionen sind für uns als SEOs einen intensiven Blick wert, schließlich profitieren wir immer von den neuen Tools.
Die aktualisierte Version des Webservers bringt nicht nur Vorbereitungen auf Cloud-Dienste und mehr Performance sondern ersetzen für uns SEO eigene Skripte durch bereits implementiere Module.
Auf viele der Features will ich nicht direkt eingehen (dazu gibt es viele andere Artikel, wie bei heise open), lediglich auf den obigen Link hinweisen, wenn sich jemand für die neuen FastCGI-Proxies für einen Webserver auf Stereoiden interessant.

Für uns interessant sind an dieser Stelle alle Features die wir als Werkzeuge für bekannte SEO-Techniken einsetzen können.
Dazu gehören:

  1. mod_sed: Filter Input (request) and Output (response) content using sed syntax
  2. mod_remoteip: Replaces the original client IP address for the connection with the useragent IP address list presented by a proxies or a load balancer via the request headers.
  3. mod_proxy_html: Rewrite HTML links in to ensure they are addressable from Clients’ networks in a proxy context.
  4. mod_proxy_express: Dynamic mass reverse proxy extension for mod_proxy

mod_sed a.k.a. Content Spinning

Durch das obige erwähnte Modul mod_sed (frei nach dem Unix-Tool sed) kann man alle aus- oder eingehenden Streams on-the-fly modifizieren. Interessant ist das für uns, wenn wir beispielsweise auf einer Seite alle Suchbegriffe je nach dem eingegebenen Keyword abändern wollen.

Mit einer beispielhaften Konfiguration sieht das folgendermaßen aus:

<Directory "/var/www/seo-projects/keyword-optimization">
AddOutputFilter Sed html
OutputSed "s/COMPUTER/notebook/g"
OutputSed "s/laptop/ultrabook/g"
</Directory>

Damit würden alle Vorkommnisse vom Wort “COMPUTER” mit “notebook” und analog “laptop” mit “ultrabook” ersetz werden.
Für geübte User gilt der Hinweis: verwendet das Modul via .htaccess und je nach hereinkommenden Keyword werden Platzhalter ersetzt.

Für den Input-Filter wird die Konfiguration gleichermaßen gesetzt, wobei hier nur die $_POST-Daten modifiziert werden. Analog dem obigen Beispiel mit:

AddInputFilter statt AddOutputFilter
InputSed statt OutputSed

mod_remoteip a.k.a. Cloaking

Mit dem Modul remoteip kann ohne weiteres eine man-in-the-middle-Attacke vorbereitet werden. Für Whitehat-SEOs kann die Technik zur optimierten Auslieferung von “mobile content” an die mobilen IP-Adressbereiche (bspw. T-Com, o2, vodafone, …) ausgeliefert werden.
Für die Blackhats unter uns kann der Google Bot, diverse Listing-Dienste und andere Crawler umgeleitet werden.

Diese Konfiguration:

RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 192.168.0.0/32
RemoteIPTrustedProxy www.webconsul.de

Leite alle Anfragen des interenen Adressbereichs 192.168.0.0/32 an den Host www.webconsul.de weiter. Wie gesagt, das kann für regionale Zwecke genutzt werden um andere Werbung auszuliefern, für mobile Adressen andere Styles oder aber auch für Suchmaschinene und Crawler um andere Inhalte zu platzieren.
Weitere Angaben zu Anwendungszwecken möchte ich nicht geben, aber angeblich soll das auch mit SSL-gesicherten Hosts und beispielsweise Banking gehen. Die Domain braucht selbst nur ein gültiges SSL-Zertifikat und kann damit alle Daten weiter- und durchleiten. Mit der obigen Kombination der Ein- und Ausgabefilter können dann Kontonummern ausgetauscht, Mailadressen geändert und vieles andere mehr ….

mod_proxy_html a.k.a. Scraping

Analog dem Modul sed modifiziert mod_proxy_html die ausgelieferten HTML-Daten. Dabei können Links auf die jeweilige Proxy-Umgebung angepasst werden, beispielsweise aber auch komplette Hosts wie google.de auf webconsul.de ;-)
Was alles modifiziert werden kann findet sich dann in dieser Auflistung: ProxyHTMLURLMap.

mod_proxy_express a.k.a. Content XY

Die Warnung sagt alles über das Modul:

Do not enable proxying until you have secured your server. Open proxy servers are dangerous both to your network and to the Internet at large.

.

Vom einfachen Content-Mapping (um Scraping vorsichtig zu umschreiben) bis zu Cloacking auf IP-Adressbereiche und mehr kann man mit einer einfachen Konfiguration viel erreichen:


www1.example.com http://192.168.211.2:8080
www2.example.com http://192.168.211.12:8088
www3.example.com http://192.168.212.10

Ob die Domains zu Beginn wie im Beispiel Subdomains, andere Domains oder vieles mehr sind, die Ziele und Wege sind so offen wie die Phantasie des Admins ;-)

Also los, schaut euch das Upgrade kurz an und gebt Gas.
Welche Tipps habt ihr zur weiteren Optimierung?

Google puscht schnelle Websites – der Proof

Sie sind hier: Startseite » Webserver

Vermutungen gibt es aktuell zu hauf, dass Google schnelle Websites puscht und besser rankt.

Seit ein paar Tagen optimiere ich fleißig an meinem Blog und ja, ich habe es bemerkt und es lässt sich ganz einfach bestätigen.
Der Graph in der Google Webmaster Zentrale (Link) hat sich seit diesem Beitrag nicht aktualisiert, müsste aber weiter nach unten gegangen seit.

Google Analytics zeigt in den letzten Tagen einen enormen Peak:

Google Analytics

Aber das untrüglichste Zeichen ist es, wenn auch andere auf den Zug aufspringen, Google zu den unterschiedlichsten Themen crawlen und innerhalb von weniger als 24 Stunden man folgenden Dashboard-Auszug sieht:

Kommentar Spam

»» Ja, Google rankt jetzt schon schnellere Websites besser. Punkt.

Website-Leistung: Datenbankoptimierung zum Geschwindigkeitsboost

Sie sind hier: Startseite » Webserver

Google arbeitet ja nach wie vor an diversen Ranking-Faktoren und bewertet dazu eben auch seit einiger Zeit die Website-Leistung.

Da auf meinem Webserver relativ viele parallele Verbindungen bestehen und jede eine Datenbankverbindung zum MySQL-Server aufbauen muss, habe ich das mal genauer analysiert.

Die Google Webmaster Zentrale gibt mir diesen Chart zur Leistung von www.webconsul.de:

webconsul.de Website-Leistung

Den Geschwindigkeitsboost habe ich, seit ich von einem normalen mysql_connect() auf mysql_pconnect() (php.net zu mysql_pconnect()) umgestellt habe.

mysql_pconnect() verhält sich sehr ähnlich zu mysql_connect(), weist aber zwei wesentliche Unterschiede auf.

Erstens: vor dem Verbindungsaufbau wird zunächst versucht eine offene (persistente) Verbindung zum gleichen Host, mit dem gleichen Benutzernamen und Benutzerkennwort zu finden. Wenn das gelingt, wird die Verbindungskennung dieser Verbindung zurückgeliefert anstatt eine neue Verbindung aufzubauen.

Zweitens: die Verbindung zum SQL Server wird beim Beenden des PHP-Skripts nicht geschlossen. Sie bleibt zur zukünftigen Verwendung bestehen.
(mysql_close() schließt keine von mysql_pconnect() geöffneten Verbindungen).

Auszug von php.net zu mysql_pconnect()

Die Umstellung hat noch einen netten Nebeneffekt auf die Prozessorauslastung, denn die Anfragen werden alle über den gleichen Prozess gehandelt und somit spart man sich zusätzliches Öffnen und Schließen.

Update auf WordPress 3.0

Sie sind hier: Startseite » Webserver

Soeben habe ich eine menge Blogs auf das neue WordPress 3.0 mit dem Releasenamen “Thelonious” in der de_DE-Version portiert.

Bei den meisten Blogs hat das Upgrade problemlos funktioniert, nur bei einem leider nicht.
Der Blog zeigt an sich nur statische Seiten an, weswegen ich mein Template so umgebogen habe, dass es keine weiteren Funktionen gibt und lediglich eine Theme-Datei geladen werden muss.

Um möglichst viele Rechenoperationen zu sparen hatte ich im Design für die Anzeige des Contents lediglich geschrieben:

Das führte dazu, dass nach dem Update der gesamte Content nicht angezeigt wurde.

Das Problem lässt sich einfach lösen, wenn man den Inhalt mit folgendem Code anzeigt:

Rechnet zwar ein paar Millisekunden länger aber das sollte keine Probleme machen.

Daher noch ein paar Empfehlungen für eine schnelle Auslieferung:

  • Fasst so viele Dateien zusammen, wie möglich. Dies sowohl bei den CSS- als auch JS-Files aber auch unbedingt die internen PHP-Aufrufe minimieren.
  • Installiert das WP-Cache-Plugin um möglichst viele Seiten statisch auszuliefern
  • Komprimiert euren Code
  • Optimiert eure Datenbank und euren Webserver auf minimale Timeouts, sodass diese lediglich so lange laufen wie nötig, aber so kurz wie möglicht.

    Hat jemand noch mehr Tips dazu?

    Beste Grüße!
    Peter

  • .htaccess-Verzeichnisschutz mit LDAP-Authentifizierung

    Sie sind hier: Startseite » Webserver

    Will man, wie ich neulich, ein Verzeichnis auf einem Webserver schützen, so gibt es nicht viele sichere Methoden.
    Die einfachste und wohl am schnellsten implementiere Lösung dafür ist, zumindest beim Apache-Webserver, der Schutz über eine .htaccess-Datei.

    Für eine handvoll User/Passwort-Paare, rate ich einfach mal nach “.htaccess Generator” zu suchen und eine der Lösungen auszuprobieren.

    Will man sich gegen ein LDAP-Backend authentifizieren, kann man das zum Beispiel folgendermaßen anstellen:
    AuthBasicProvider ldap
    AuthType Basic
    AuthName "Dein Account zum Sicherheitsbereich"
    require ldap-attribute employeeType=User
    require ldap-attribute employeeType=Admin
    require ldap-attribute employeeType=Editor
    AuthzLDAPAuthoritative on
    AuthLDAPURL ldaps://ldap.server.de/ou=People,dc=server,dc=com

    Damit sollten sich User der Gruppe User, Admin und Editor anmelden können.

    Das z im “AuthzLDAPAuthoritative on” ist kein Schreibfehler sondern gehört zum Modulname.

    Wenn der Login nur über eine sichere SSL-Leitung erfolgen soll, reicht es, wenn man einfach vor dem obigen Block noch ein:
    SSLRequireSSL
    einfügt.