Der Vorteil von 'statischen' Links liegt in erster Linie an der besseren Beachtung durch Suchmaschinen - bei meinem eigentlichen OS-Projekt PostNuke haben wir mit der Einführung von statischen Links wesentliche bessere Google-Rankings erzielen können und nahezu alle unsere Seiten in den Suchergebnissen untergebracht - die Grundidee, dass ganze auch in einer phpBB2-Standalone Installation umzusetzen stammt im übrigen nicht zuletzt auch aus dem internationalen Forum: How Google spiders PHPBB! sowie phpBB Search Engine Optimization - Sessions, page rank.... von able2know.com.
Weiterführende Informationen rund um das Thema Suchmaschinen-Optimierung finden sich übrigens auch in meinem SEO-Blog.
Anmerkung: Diese Umsetzung der 'Short URLs' setzt auf das sogenannte URL-Rewriting von Apache Webserver auf, für Benutzer anderer Webserver ala IIS & Co. gibt es teilweise ebenfalls Ansätze, die ich persönlich aber noch nicht ausgetestet habe

1) Aktivierung der Short URLs via .htaccess für den Webserver:
Soweit vom Provider unterstützt kann man via 'Rewrite Rules' den Apache anweisen, auch bei Anfragen nach bestimmten 'kurzen' URLs die entprechend 'langen' URLs auszuliefern (die Apache Dokumentation liefert weitere Informationen):
Code: Alles auswählen
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} /forums.html
RewriteRule (.*) /index.php [L]
RewriteCond %{REQUEST_FILENAME} /viewforum([0-9]*)-([0-9]*)-([0-9]*).html
RewriteRule (.*) /viewforum.php?f=%1&topicdays=%2&start=%3 [L]
RewriteCond %{REQUEST_FILENAME} /forum([0-9]*).html
RewriteRule (.*) /viewforum.php?f=%1 [L]
RewriteCond %{REQUEST_FILENAME} /ptopic([0-9]*).html
RewriteRule (.*) /viewtopic.php?t=%1&view=previous [L]
RewriteCond %{REQUEST_FILENAME} /ntopic([0-9]*).html
RewriteRule (.*) /viewtopic.php?t=%1&view=next [L]
RewriteCond %{REQUEST_FILENAME} /ftopic([0-9]*)-([0-9]*)-([a-zA-Z]*)-([0-9]*).html
RewriteRule (.*) /viewtopic.php?t=%1&postdays=%2&postorder=%3&start=%4 [L]
RewriteCond %{REQUEST_FILENAME} /ftopic([0-9]*)-([0-9]*).html
RewriteRule (.*) /viewtopic.php?t=%1&start=%2 [L]
RewriteCond %{REQUEST_FILENAME} /ftopic([0-9]*).html
RewriteRule (.*) /viewtopic.php?t=%1 [L]
RewriteCond %{REQUEST_FILENAME} /ftopic([0-9]*).html
RewriteRule (.*) /viewtopic.php?t=%1&start=%2&postdays=%3&postorder=%4&highlight=%5 [L]
2. Definition von Seiten, die nicht gespidert werden sollen:
Durch die 'Short URLs' werden teilweise identische Seiten unter verschiedenen URLs abrufbar - damit sie nicht auch doppelt in den Suchmaschinen gelistet werden, sollte man via robots.txt entsprechende Ausnahmen definieren:
Code: Alles auswählen
User-agent: *
Disallow: /PFAD_ZUM_FORUM/admin/
Disallow: /PFAD_ZUM_FORUM/db/
Disallow: /PFAD_ZUM_FORUM/images/
Disallow: /PFAD_ZUM_FORUM/includes/
Disallow: /PFAD_ZUM_FORUM/language/
Disallow: /PFAD_ZUM_FORUM/templates/
Disallow: /PFAD_ZUM_FORUM/config.php
Disallow: /PFAD_ZUM_FORUM/profile.php
Disallow: /PFAD_ZUM_FORUM/groupcp.php
Disallow: /PFAD_ZUM_FORUM/memberlist.php
Disallow: /PFAD_ZUM_FORUM/modcp.php
Disallow: /PFAD_ZUM_FORUM/posting.php
Disallow: /PFAD_ZUM_FORUM/privmsg.php
Disallow: /PFAD_ZUM_FORUM/viewonline.php
Disallow: /PFAD_ZUM_FORUM/faq.php
Disallow: /PFAD_ZUM_FORUM/ptopic*.html$
Disallow: /PFAD_ZUM_FORUM/ntopic*.html$
Disallow: /PFAD_ZUM_FORUM/ftopic*asc*.html$
3. Linkanpassung innerhalb des phpBB2
Die Links innerhalb des Forums müssen nun noch umgeschrieben werden - am einfachsten funktioniert das, wenn man eine entsprechende Funktion definiert, den gesamten Output vor der Ausgabe in einen sog. 'Output Buffer' übernimmt und dann die enthaltenen Links umschreibt. Der Ansatzpunkt hierzu ist in der /includes/page_header.php (Start des Output Bufferings sowie Definition der Funktion) und in der /includes/page_tail.php (Anwendung der Funktion sowie Ausgabe des Output Buffers jeweils für Installationen mit und ohne Kompression):
In /includes/page_header.php vor
Code: Alles auswählen
//
// Generate logged in/logged out status
//
Code: Alles auswählen
//
// Short URL implementation
//
// start buffering
ob_start();
function replace_for_mod_rewrite(&$s) {
// get the correct base_url: protocoll,url,path to make sure to rewrite only internal links
if (empty($HTTP_SERVER_VARS['HTTP_HOST'])) {
$server = getenv('HTTP_HOST');
} else {
$server = $HTTP_SERVER_VARS['HTTP_HOST'];
}
// IIS sets HTTPS=off
if (isset($HTTP_SERVER_VARS['HTTPS']) && $HTTP_SERVER_VARS['HTTPS'] != 'off') {
$proto = 'https://';
} else {
$proto = 'http://';
}
// Get the name of this URI
// Start of with REQUEST_URI
if (isset($HTTP_SERVER_VARS['REQUEST_URI'])) {
$path = $HTTP_SERVER_VARS['REQUEST_URI'];
} else {
$path = getenv('REQUEST_URI');
}
if ((empty($path)) || (substr($path, -1, 1) == '/')) {
// REQUEST_URI was empty or pointed to a path
// Try looking at PATH_INFO
$path = getenv('PATH_INFO');
if (empty($path)) {
// No luck there either
// Try SCRIPT_NAME
if (isset($HTTP_SERVER_VARS['SCRIPT_NAME'])) {
$path = $HTTP_SERVER_VARS['SCRIPT_NAME'];
} else {
$path = getenv('SCRIPT_NAME');
}
}
}
$path = preg_replace('/[#\?].*/', '', $path);
$path = dirname($path);
if (preg_match('!^[/\\\]*$!', $path)) {
$path = '';
}
$base_url = "$proto$server$path/";
$prefix = '|"(?:'.$base_url.')?';
// now that we know about the correct $prefix we can start the rewriting
$urlin =
array(
$prefix . '(?<!/)index.php"|',
$prefix . '(?<!/)viewforum.php\?f=([0-9]*)&(?:amp;)topicdays=([0-9]*)&(?:amp;)start=([0-9]*)"|',
$prefix . '(?<!/)viewforum.php\?f=([0-9]*)"|',
$prefix . '(?<!/)viewtopic.php\?t=([0-9]*)&(?:amp;)view=previous"|',
$prefix . '(?<!/)viewtopic.php\?t=([0-9]*)&(?:amp;)view=next"|',
$prefix . '(?<!/)viewtopic.php\?t=([0-9]*)&(?:amp;)postdays=([0-9]*)&(?:amp;)postorder=([a-zA-Z]*)&(?:amp;)start=([0-9]*)"|',
$prefix . '(?<!/)viewtopic.php\?t=([0-9]*)&(?:amp;)start=([0-9]*)&(?:amp;)postdays=([0-9]*)&(?:amp;)postorder=([a-zA-Z]*)&(?:amp;)highlight=([a-zA-Z0-9]*)"|',
$prefix . '(?<!/)viewtopic.php\?t=([0-9]*)&(?:amp;)start=([0-9]*)"|',
$prefix . '(?<!/)viewtopic.php\?t=([0-9]*)"|',
);
$urlout = array(
'"forums.html"',
'"viewforum\\1-\\2-\\3.html"',
'"forum\\1.html"',
'"ptopic\\1.html"',
'"ntopic\\1.html"',
'"ftopic\\1-\\2-\\3-\\4.html"',
'"ftopic\\1.html"',
'"ftopic\\1-\\2.html"',
'"ftopic\\1.html"',
);
$s = preg_replace($urlin, $urlout, $s);
return $s;
}
Code: Alles auswählen
$db->sql_close();
Code: Alles auswählen
//
// Short URL implementation
//
$contents = ob_get_contents();
ob_end_clean();
echo replace_for_mod_rewrite($contents);
Code: Alles auswählen
$gzip_contents = ob_get_contents();
Code: Alles auswählen
//
// Short URL implementation
//
$gzip_contents = replace_for_mod_rewrite($gzip_contents);
Das phpBB2 hängt oftmals einen 'sid' Parameter an die URL an, an der sich Suchmaschinen in aller Regel stören. Mit der folgenden Änderung wird dieser sid-Parameter bei unregistrierten Benutzern (was ja letztendlich auch Suchmaschinen sind) vollständig ausgeblendet. Entgegen einigen Postings im internationalen Forum scheint damit kein Problem bei anonymen Postings verbunden zu sein.
In /includes/sessions.php anstelle von
Code: Alles auswählen
$SID = 'sid=' . $session_id;
Code: Alles auswählen
if ( $userdata['session_user_id'] != ANONYMOUS || $userdata['session_page'] == -4 || $userdata['session_page'] == -2 ){
$SID = 'sid=' . $session_id;
} else {
$SID = '';
}

Unter http://www.nuforum.de ist das ganze übrigens in Aktion zu sehen.
Disclaimer: Wie bei allen Hacks/Modifikationen üblich, sollte man vor jeder Änderung ein Backup der entsprechenden Datei anlegen

EDIT 02.01.04: robots.txt optimiert
EDIT 04.01.04 .htaccess, robots.txt und function replace_for_mod_rewrite optimiert
EDIT 19.02.04 ausgabe in page_tail.php für korrekte CRC prüfsumme gefixt
EDIT 09.03.04 fix für 'mark topics' in .htaccess und page_header.php
EDIT 12.03.04 .htaccess geändert für kompatibilität mit 1&1 webhosting
EDIT 26.08.04 .htaccess mit [L] flags versehen und auf .html als Endung gesetzt, kleine Textänderungen zum besseren Verständnis
EDIT 12.02.05 Link zum SEO-Blog
EDIT 02.03.05 Fix für Visual Confirmation Code - thx an ReneDD
EDIT 28.03.05 Weiterleitung zum robots.txt Beitrag eingefügt
EDIT 15.06.05 Fix für Suche (unregistrierte Benutzer ohne Cookie)