Short URLs für phpBB2

In diesem Forum können Mod-Autoren ihre Mods vorstellen, die sich noch im Entwicklungsstatus befinden. Der Einbau in Foren im produktiven Betrieb wird nicht empfohlen.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.0, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Benutzeravatar
larsneo
Mitglied
Beiträge: 2622
Registriert: 07.03.2002 15:23
Wohnort: schwäbisch gmünd
Kontaktdaten:

Short URLs für phpBB2

Beitrag 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)
Zuletzt geändert von larsneo am 15.06.2005 10:41, insgesamt 11-mal geändert.
gruesse aus dem wilden sueden
larsneo
..::[krapohl.net]::..
Benutzeravatar
Nico Haase
Mitglied
Beiträge: 1100
Registriert: 10.08.2003 15:19
Wohnort: Neu-Anspach / Darmstadt
Kontaktdaten:

Beitrag 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....
Buchtips.net bietet mehr als 2500 Buchrezensionen
Benutzeravatar
itst
Ehrenadmin
Beiträge: 7418
Registriert: 21.08.2001 02:00
Wohnort: Büttelborn bei Darmstadt
Kontaktdaten:

Beitrag 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
Sascha A. Carlin,
phpBB.de Ehrenadministrator
:o
Benutzeravatar
larsneo
Mitglied
Beiträge: 2622
Registriert: 07.03.2002 15:23
Wohnort: schwäbisch gmünd
Kontaktdaten:

Beitrag 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:
gruesse aus dem wilden sueden
larsneo
..::[krapohl.net]::..
Jason

Beitrag von Jason »

Weiss zufällig jemand ob das mit den short urls bei hosteurope funktioniert?

Grüße Jason
Benutzeravatar
larsneo
Mitglied
Beiträge: 2622
Registriert: 07.03.2002 15:23
Wohnort: schwäbisch gmünd
Kontaktdaten:

Beitrag 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
gruesse aus dem wilden sueden
larsneo
..::[krapohl.net]::..
Jason

Beitrag 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
Benutzeravatar
larsneo
Mitglied
Beiträge: 2622
Registriert: 07.03.2002 15:23
Wohnort: schwäbisch gmünd
Kontaktdaten:

Beitrag 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:)
gruesse aus dem wilden sueden
larsneo
..::[krapohl.net]::..
Jason

Beitrag 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
Checka
Mitglied
Beiträge: 12
Registriert: 25.07.2003 12:19

Beitrag 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.
Antworten

Zurück zu „phpBB 2.0: Mods in Entwicklung“