Seite 1 von 131

Short URLs für phpBB2

Verfasst: 01.01.2004 17:16
von larsneo
Nachdem eine kurze Forensuche keine Ergebnisse gebracht hat, poste ich hier einfach einmal meinen Ansatz 'statisch aussehende' Links (also zum Beispiel 'forum1.html' anstelle von 'viewforum.php?f=1' und 'ftopic1.html' anstelle von 'viewtopic.php?t=1') umzusetzen.
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 :roll:

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]
Nachdem die .htaccess in das Webroot (wo beispielsweise auch die config.php liegt) kopiert wurde, kann man via direkter URL-Eingabe testen, ob die kurzen URLs unterstützt werden. Wenn also bei Eingabe von 'forum1.html' das erste Forum angezeigt wird, kann es mit den nächsten Schritten weitergehen...

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$
Weiterführende Informationen zum Thema robots.txt und auch eine optimierte Variante finden sich auch *hier*.

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 
//
folgenden Code-Abschnitt einfügen:

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; 
}
und in /includes/page_tail.php nach

Code: Alles auswählen

$db->sql_close();
folgenden Bereich einfügen

Code: Alles auswählen

//
// Short URL implementation
//
$contents = ob_get_contents(); 
ob_end_clean(); 
echo replace_for_mod_rewrite($contents);
sowie etwas später in derselben Datei nach

Code: Alles auswählen

   $gzip_contents = ob_get_contents(); 
folgenden Abschnitt einfügen:

Code: Alles auswählen

   // 
   // Short URL implementation 
   // 
   $gzip_contents = replace_for_mod_rewrite($gzip_contents);
4. Ausblenden der Session ID für unregistrierte Benutzer
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; 
das folgende Snippet nutzen:

Code: Alles auswählen

if ( $userdata['session_user_id'] != ANONYMOUS || $userdata['session_page'] == -4 || $userdata['session_page'] == -2 ){
   $SID = 'sid=' . $session_id; 
} else { 
   $SID = ''; 
} 
Damit sollten nun eigentlich alle wesentlichen Links als 'Short URL' angezeigt und verfügbar sein ;-)
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 :roll:

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)

Verfasst: 01.01.2004 22:54
von Nico Haase
Gute Idee, danke. Das gibts ja schon in einer Umsetzung, die das mit Ordnern löst, aber das hier gefällt mir viel besser. Problematisch ist nur, dass das immer nur mit aktivierter gzip-Komprimierung geht, die bei mir nimmer klappt. Irgendwie hab ich mir das Forum kaputtgescriptet und warte nu auf phpbb 2.2....

Verfasst: 01.01.2004 23:06
von itst
Hi larsneo ;-)

Wie immer ein klasse Beitrag, vielen Dank!

Eventuell würde ich das gerne für die KB übernehmen, mit einigen Anpassungen und Erläuterungen. Wäre das OK für Dich?

Gruß, Sascha Carlin

Verfasst: 01.01.2004 23:18
von larsneo
Problematisch ist nur, dass das immer nur mit aktivierter gzip-Komprimierung geht, die bei mir nimmer klappt.
das sollte eigentlich unabhängig von der gzip komprimierung funktionieren - in der page_tail.php erfolgt ja für beide fälle die ausgabe des output buffers...
Eventuell würde ich das gerne für die KB übernehmen, mit einigen Anpassungen und Erläuterungen. Wäre das OK für Dich?
natürlich - würde mich freuen ;-)
teste aber das ganze am besten vorher noch einmal aus - insbesondere was die session id geschichte angeht bin ich nicht allzutief im phpBB2 code :roll:

Verfasst: 01.01.2004 23:38
von Jason
Weiss zufällig jemand ob das mit den short urls bei hosteurope funktioniert?

Grüße Jason

Verfasst: 02.01.2004 00:25
von larsneo
Weiss zufällig jemand ob das mit den short urls bei hosteurope funktioniert?
sollte funktionieren ;-)

man kann übrigens den webserver auf das vorhandensein der notwendigen mod_rewrite erweiterung in aller regel mittels einer phpinfo.php überprüfen:

Code: Alles auswählen

<?php
phpinfo();
?>
in der 'apache' sektion sollte sich dabei das mod_rewrite befinden:
Loaded Modules mod_php4, mod_frontpage, mod_setenvif, mod_auth, mod_access, mod_rewrite, mod_alias, mod_userdir, mod_actions, mod_imap, mod_asis, mod_cgi, mod_dir, mod_autoindex, mod_include, mod_status, mod_negotiation, mod_mime, mod_log_config, mod_env, http_core

Verfasst: 02.01.2004 18:39
von Jason
hi,

ich habe dort mod_rewrite stehen:
Loaded Modules mod_php4, mod_frontpage, mod_setenvif, mod_so, mod_auth, mod_access, mod_rewrite, mod_alias, mod_userdir, mod_actions, mod_imap, mod_asis, mod_cgi, mod_dir, mod_autoindex, mod_include, mod_status, mod_negotiation, mod_mime, mod_log_config, mod_env, http_core
aber trotzdem funktioniert es nicht, ich habe eine htaccess datei im foren-root verzeichnis erstellt mit diesem inhalt:

Code: Alles auswählen

php_flag session.use_trans_sid off 

RewriteEngine On 
RewriteRule ^forums.* index.php 
RewriteRule ^forum([0-9]*).* viewforum.php?f=$1&mark=topic 
RewriteRule ^viewforum([0-9]*)-([0-9]*)-([0-9]*).* viewforum.php?f=$1&topicdays=$2&start=$3 
RewriteRule ^forum([0-9]*).* viewforum.php?f=$1 
RewriteRule ^ptopic([0-9]*).* viewtopic.php?t=$1&view=previous 
RewriteRule ^ntopic([0-9]*).* viewtopic.php?t=$1&view=next 
RewriteRule ^ftopic([0-9]*)-([0-9]*)-([a-zA-Z]*)-([0-9]*).* viewtopic.php?t=$1&postdays=$2&postorder=$3&start=$4 
RewriteRule ^ftopic([0-9]*)-([0-9]*).* viewtopic.php?t=$1&start=$2 
RewriteRule ^ftopic([0-9]*).* viewtopic.php?t=$1 
RewriteRule ^ftopic([0-9]*).html viewtopic.php?t=$1&start=$2&postdays=$3&postorder=$4&highlight=$5 
RewriteRule ^sutra([0-9]*).* viewtopic.php?p=$1
danach habe ich probiert ein forum über http://www.meine-domain.de/forum47.html aufzurufen aber es kommt nur ein "Seite nicht gefunden" ?

Grüße Jason

Verfasst: 02.01.2004 18:51
von larsneo
hmmh - die datei heisst also definitiv .htaccess (also mit punkt am anfang und ohne datei-erweiterung) und liegt im root der installation?
(hosteurope sollte funktionieren, schliesslich liegt meine beispielpräsenz auch dort :roll:)

Verfasst: 02.01.2004 20:26
von Jason
larsneo hat geschrieben:hmmh - die datei heisst also definitiv .htaccess (also mit punkt am anfang und ohne datei-erweiterung) und liegt im root der installation?
(hosteurope sollte funktionieren, schliesslich liegt meine beispielpräsenz auch dort :roll:)
Ja sie heisst definitiv .htaccess und liegt im root hmm..

Grüße Jason

Verfasst: 03.01.2004 10:08
von Checka
Guten Morgen.

An und für sich würde bei mir alles klappen. Dummerweise liegt mein "Forenarchiv", auf Lycos, und die Rewrite ist OFF.

Gibts andere Möglichkeiten? Eher nicht, oder?


@Jason.
Schau mal bitte, ob die htaccess KOMPLETT und in RICHTIGEM Format übertragen wird! Gerne kommt bei nem FTP-Proggi ein kauderwelsch an.