Seite 1 von 26

Short URLs für phpBB2 (reloaded / RFC)

Verfasst: 31.12.2004 10:43
von larsneo
Als Ergänzung zum bestehenden Topic Short URLs für phpBB2 habe ich mich zum Jahresende einmal dran gemacht, das Rewriting möglichst komplett auszuführen und 'Doppellinks' nach Möglichkeit zu unterbinden.
Als Zwischenstand und auch als 'Request for Comments' hier nun einmal das aktuell im nuForum im Einsatz befindliche Rewriting - quasi als Release Candidate und nicht zum Einsatz in Produktivumgebungen - das gilt insbesondere wenn man sich mit dem Thema nicht auskennt.

Einige grundsätzliche Dinge bitte ich zu beachten
- Die Grundlagen zum Rewriting sind im o.a. Topic ausführlich beschrieben, hier geht es um Optimierungen die noch nicht wirklich ausgetestet sind
- Das Rewriting via preg_replace kostet Performance, je umfangreicher umso mehr (das nuForum läuft auf einem eigenen Server)
- Eventuelle Fragen zum Einsatz der .htaccess am Besten an den Provider richten, es gibt teilweise auch unterschiedliche Syntaxmöglichkeiten
- Die folgenden Snippets sind aktuell erst einmal für Testumgebungen gedacht - und sollten nur von Leuten ausprobiert werden, die sich mit dem Thema Rewriting bereits auseinandergesetzt haben.
- Die u.a. Snippets beziehen sich teilweise auch auf im nuForum integrierte Mods/Hacks

Bislang bekannte Probleme
- Die Suche nach allen Beiträgen von Benutzern mit bestimmten Sonderzeichen ('+') funktioniert (noch) nicht - wer eine regexp für im phpBB2 erlaubte Benutzer greifbar hat bitte melden ;-)

Weiterführende Informationen rund um das Thema Suchmaschinen-Optimierung und auch eine für die Short URLs angepasste Google Sitemap finden sich übrigens auch in meinem SEO-Blog.

Short URLs für phpBB2 (reloaded / RFC)
Anpassungen gegenüber dem Original-Topic
als neue .htaccess (Pfadangaben ggfs. anpassen!) [1]

Code: Alles auswählen

RewriteEngine On 

# prevent access from santy webworm a-e
RewriteCond %{QUERY_STRING} ^(.*)highlight=\%2527 [OR]
RewriteCond %{QUERY_STRING} ^(.*)rush=\%65\%63\%68 [OR]
RewriteCond %{QUERY_STRING} ^(.*)rush=echo [OR]
RewriteCond %{QUERY_STRING} ^(.*)wget\%20 [OR]
RewriteCond %{QUERY_STRING} ^(.*)cmd=
RewriteRule ^.*$ http://127.0.0.1/ [R,L]

# prevent pre php 4.3.10 bug
RewriteCond %{HTTP_COOKIE}% s:(.*):\%22test1\%22\%3b
RewriteRule ^.*$ http://127.0.0.1/ [R,L]

# prevent perl user agent (most often used by santy)
RewriteCond %{HTTP_USER_AGENT} ^lwp.* [NC]
RewriteRule ^.*$ http://127.0.0.1/ [R,L]

# extended rewriting only for .html [thx to Caterham]
RewriteRule !\.html$ - [L] 

# Short URL implementation [larsneo]
RewriteCond %{REQUEST_URI} ^/nuforum/forums\.html 
RewriteRule (.*) /nuforum/index.php [R=301,L]

RewriteCond %{REQUEST_URI} ^/nuforum/index-mark\.html
RewriteRule (.*) /nuforum/index.php?mark=forums [L]

RewriteCond %{REQUEST_URI} ^/nuforum/index\.html
RewriteRule (.*) /nuforum/index.php [L]

RewriteCond %{REQUEST_URI} ^/nuforum/category([0-9]*)\.html 
RewriteRule (.*) /nuforum/index.php?c=%1 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/forum([0-9]*)-([0-9]*)-([0-9]*)\.html  
RewriteRule (.*) /nuforum/viewforum.php?f=%1&topicdays=%2&start=%3 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/forum([0-9]*)-([0-9]*)\.html  
RewriteRule (.*) /nuforum/viewforum.php?f=%1&start=%2 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/forum([0-9]*)-mark\.html 
RewriteRule (.*) /nuforum/viewforum.php?f=%1&mark=topics [L]

RewriteCond %{REQUEST_URI} ^/nuforum/forum([0-9]*)\.html 
RewriteRule (.*) /nuforum/viewforum.php?f=%1 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/ptopic([0-9]*)\.html 
RewriteRule (.*) /nuforum/viewtopic.php?t=%1&view=previous [L]

RewriteCond %{REQUEST_URI} ^/nuforum/ntopic([0-9]*)\.html 
RewriteRule (.*) /nuforum/viewtopic.php?t=%1&view=next [L]

RewriteCond %{REQUEST_URI} ^/nuforum/ftopic([0-9]*)-([0-9]*)-([a-zA-Z]*)-([0-9]*)-([a-zA-Z0-9]*)\.html 
RewriteRule (.*) /nuforum/viewtopic.php?t=%1&start=%2&postdays=%3&postorder=%4&highlight=%5 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/ftopic([0-9]*)-([0-9]*)-([a-zA-Z]*)-([0-9]*)\.html 
RewriteRule (.*) /nuforum/viewtopic.php?t=%1&postdays=%2&postorder=%3&start=%4 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/ftopic([0-9]*)-([0-9]*)\.html 
RewriteRule (.*) /nuforum/viewtopic.php?t=%1&start=%2 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/ftopic([0-9]*)\.html 
RewriteRule (.*) /nuforum/viewtopic.php?t=%1 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/fpost([0-9]*)\.html 
RewriteRule (.*) /nuforum/viewtopic.php?p=%1 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/post-newtopic-([0-9]*)\.html 
RewriteRule (.*) /nuforum/posting.php?mode=newtopic&f=%1 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/post-reply-([0-9]*)\.html 
RewriteRule (.*) /nuforum/posting.php?mode=reply&t=%1 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/post-([a-z]*)-([0-9]*)\.html 
RewriteRule (.*) /nuforum/posting.php?mode=%1&p=%2 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/album\.html 
RewriteRule (.*) /nuforum/album.php [L]

RewriteCond %{REQUEST_URI} ^/nuforum/albumpic([0-9]*)-([a-z]*)\.html 
RewriteRule (.*) /nuforum/album_page.php?pic_id=%1&mode=%2 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/albumpic([0-9]*)\.html 
RewriteRule (.*) /nuforum/album_page.php?pic_id=%1 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/palbum\.html 
RewriteRule (.*) /nuforum/album_personal_index.php [L]

RewriteCond %{REQUEST_URI} ^/nuforum/palbum([0-9]*)\.html 
RewriteRule (.*) /nuforum/album_personal.php?user_id=%1 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/profile([0-9]*)\.html 
RewriteRule (.*) /nuforum/profile.php\?mode=viewprofile&u=%1 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/search-author-(.*)\.html 
RewriteRule (.*) /nuforum/search.php\?search_author=%1 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/search-([0-9]*)-([0-9]*)\.html 
RewriteRule (.*) /nuforum/search.php\?search_id=%1&start=%2 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/search-([a-zA-Z]*)\.html 
RewriteRule (.*) /nuforum/search.php\?search_id=%1 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/privmsg-([a-zA-Z]*)-([0-9]*)\.html 
RewriteRule (.*) /nuforum/privmsg.php\?mode=%1&u=%2 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/privmsg-([a-zA-Z]*)\.html 
RewriteRule (.*) /nuforum/privmsg.php\?folder=%1 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/register\.html 
RewriteRule (.*) /nuforum/profile.php\?mode=register&agreed=true [L]

RewriteCond %{REQUEST_URI} ^/nuforum/profile-([a-zA-Z0-9]*)\.html 
RewriteRule (.*) /nuforum/profile.php\?mode=%1 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/map-([0-9]*)\.html 
RewriteRule (.*) /nuforum/map.php\?highlight=%1 [L]

RewriteCond %{REQUEST_URI} ^/nuforum/map\.html 
RewriteRule (.*) /nuforum/map.php [L]

RewriteCond %{REQUEST_URI} ^/nuforum/faq\.html 
RewriteRule (.*) /nuforum/faq.php [L]

RewriteCond %{REQUEST_URI} ^/nuforum/search\.html 
RewriteRule (.*) /nuforum/search.php [L]

RewriteCond %{REQUEST_URI} ^/nuforum/memberlist\.html 
RewriteRule (.*) /nuforum/memberlist.php [L]

RewriteCond %{REQUEST_URI} ^/nuforum/groups\.html 
RewriteRule (.*) /nuforum/groupcp.php [L]

RewriteCond %{REQUEST_URI} ^/nuforum/report\.html 
RewriteRule (.*) /nuforum/report.php [L]

RewriteCond %{REQUEST_URI} ^/nuforum/online\.html 
RewriteRule (.*) /nuforum/viewonline.php [L]
Änderungen in /includes/page_header.php

Code: Alles auswählen

//
// start Short URL implementation [larsneo]
//
// 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\?mark=forums"|', 
$prefix . '(?<!/)index.php"|',
$prefix . '(?<!/)index.php\?c=([0-9]*)"|', 
$prefix . '(?<!/)viewforum.php\?f=([0-9]*)&(?:amp;)topicdays=0&(?:amp;)start=0"|', 
$prefix . '(?<!/)viewforum.php\?f=([0-9]*)&(?:amp;)topicdays=0&(?:amp;)start=([0-9]*)"|', 
$prefix . '(?<!/)viewforum.php\?f=([0-9]*)&(?:amp;)topicdays=([0-9]*)&(?:amp;)start=([0-9]*)"|', 
$prefix . '(?<!/)viewforum.php\?f=([0-9]*)&(?:amp;)mark=topics"|', 
$prefix . '(?<!/)viewforum.php\?f=([0-9]*)"|', 
$prefix . '(?<!/)viewtopic.php\?t=([0-9]*)&(?:amp;)highlight="|', 
$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;)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;)postdays=0&(?:amp;)postorder=asc&(?:amp;)start=0"|', 
$prefix . '(?<!/)viewtopic.php\?t=([0-9]*)&(?:amp;)postdays=0&(?:amp;)postorder=asc&(?:amp;)start=([0-9]*)"|', 
$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"|', 
$prefix . '(?<!/)viewtopic.php\?t=([0-9]*)&(?:amp;)start=([0-9]*)"|', 
$prefix . '(?<!/)viewtopic.php\?t=([0-9]*)"|', 
$prefix . '(?<!/)viewtopic.php\?p=([0-9]*)&(?:amp;)highlight=#([0-9]*)"|', 
$prefix . '(?<!/)viewtopic.php\?p=([0-9]*)#([0-9]*)"|', 
$prefix . '(?<!/)posting.php\?mode=newtopic&(?:amp;)f=([0-9]*)"|', 
$prefix . '(?<!/)posting.php\?mode=reply&(?:amp;)t=([0-9]*)"|', 
$prefix . '(?<!/)posting.php\?mode=([a-z]*)&(?:amp;)p=([0-9]*)"|', 
$prefix . '(?<!/)album.php"|', 
$prefix . '(?<!/)album_personal_index.php"|', 
$prefix . '(?<!/)album_personal.php\?user_id=([0-9]*)"|', 
$prefix . '(?<!/)profile.php\?mode=viewprofile&(?:amp;)u=([0-9]*)"|', 
$prefix . '(?<!/)search.php\?search_author=([[:alnum:]%+\.]+)"|', 
$prefix . '(?<!/)search.php\?search_id=([0-9]*)&(?:amp;)start=([0-9]*)"|', 
$prefix . '(?<!/)search.php\?search_id=([a-zA-Z]*)"|', 
$prefix . '(?<!/)privmsg.php\?mode=([a-zA-Z]*)&(?:amp;)u=([0-9]*)"|', 
$prefix . '(?<!/)privmsg.php\?folder=([a-zA-Z]*)"|', 
$prefix . '(?<!/)profile.php\?mode=register&(?:amp;)agreed=true"|', 
$prefix . '(?<!/)profile.php\?mode=([0-9a-zA-Z]*)"|', 
$prefix . '(?<!/)map.php\?highlight=([0-9]*)"|', 
$prefix . '(?<!/)map.php"|', 
$prefix . '(?<!/)faq.php"|', 
$prefix . '(?<!/)search.php"|', 
$prefix . '(?<!/)memberlist.php"|', 
$prefix . '(?<!/)groupcp.php"|', 
$prefix . '(?<!/)report.php"|', 
$prefix . '(?<!/)viewonline.php"|', 
); 
$urlout = array( 
'"index-mark.html"',
'"index.html"',
'"category\\1.html"',
'"forum\\1.html"', 
'"forum\\1-\\2.html"', 
'"forum\\1-\\2-\\3.html"', 
'"forum\\1-mark.html"', 
'"forum\\1.html"', 
'"ftopic\\1.html"', 
'"ptopic\\1.html"', 
'"ntopic\\1.html"', 
'"ftopic\\1.html"', 
'"ftopic\\1.html"', 
'"ftopic\\1-\\2.html"', 
'"ftopic\\1-\\2-\\3-\\4.html"', 
'"ftopic\\1.html"',
'"ftopic\\1-\\2.html"', 
'"ftopic\\1.html"', 
'"fpost\\1.html#\\2"', 
'"fpost\\1.html#\\2"', 
'"post-newtopic-\\1.html"',
'"post-reply-\\1.html"',
'"post-\\1-\\2.html"',
'"album.html"', 
'"palbum.html"', 
'"palbum\\1.html"', 
'"profile\\1.html"', 
'"search-author-\\1.html"',
'"search-\\1-\\2.html"',
'"search-\\1.html"',
'"privmsg-\\1-\\2.html"',
'"privmsg-\\1.html"',
'"register.html"',
'"profile-\\1.html"',
'"map-\\1.html"',
'"map.html"',
'"faq.html"',
'"search.html"',
'"memberlist.html"',
'"groups.html"',
'"report.html"',
'"online.html"',
); 

$s = preg_replace($urlin, $urlout, $s); 
return $s; 
}
//
// end Short URL implementation [larsneo]
//
(und natürlich die weiteren Anpassungen aus dem Original-Topic)

EDIT:
01.04.05 .htaccess Syntax optimiert
13.03.06 Link zur Google Sitemap hinzugefügt

Verfasst: 31.12.2004 11:56
von kratzer54847
hoi larsneo,

wo liegen denn nun die ungefähren Neuerungen dieser Version?

mfg Johny

Verfasst: 31.12.2004 12:06
von larsneo
mit der neuen version wird nahezu alles umgeschrieben, fehler (wie z.b. in der highlight- und postdays-behandlung) wurden korrigiert und mehrfachlinks auf identischen content sollten reduziert/behoben sein.

Verfasst: 31.12.2004 12:10
von kratzer54847
hoi,

eine Frage hätte ich da noch:

warum wird die privmsg.php mit indiziert?
auf die sollte eine Suchmaschine doch eigentlich keinen Zugriff haben?

mfg Johny

Verfasst: 31.12.2004 12:36
von Nico Haase
trotzdem sehen die urls auch da doch besser aus ;)

Verfasst: 31.12.2004 12:57
von larsneo
yep - irgendwie ist das ganze ja auch ein POC aus langweiligen stunden :cookie:

Verfasst: 31.12.2004 14:03
von adidas
toll, das andere habe ich schwer hinbekommen, weil ich ne alte catogeries hiarchy mod habe (danke rabbit, er hat mir gehilfen :D)

nun kriege ich das bestimmt nie hin :cry:

Verfasst: 01.01.2005 09:15
von Nico Haase
du meinst, du hast jetzt grad die andere short-url-version drin, die funktioniert auch, und dann kommt ne neue? hmm: einfach alte ordentlich ausbauen und neue drüber ;)

Verfasst: 01.01.2005 10:54
von larsneo
larsneo hat geschrieben:[...]
quasi als Release Candidate und nicht zum Einsatz in Produktivumgebungen - das gilt insbesondere wenn man sich mit dem Thema nicht auskennt.
[...]
Die folgenden Snippets sind aktuell erst einmal für Testumgebungen gedacht - und sollten nur von Leuten ausprobiert werden, die sich mit dem Thema Rewriting bereits auseinandergesetzt haben.
:roll:

Verfasst: 01.01.2005 13:32
von saerdnaer
gibts irgendwo ne demo?

ah