Short URL nochmal reloaded

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
tas2580
Ehemaliges Teammitglied
Beiträge: 3029
Registriert: 01.07.2004 05:42
Wohnort: /home/tas2580
Kontaktdaten:

Short URL nochmal reloaded

Beitrag von tas2580 »

Ich hab mir auch mal so meine Gedanken zu den URLs gemacht.
Der Short URL Mod ist da ja schonmal nicht schlecht, hilft aber den Suchmaschienen an vielen Stellen den Doppelten Content zu entdecken. Die URLs ptopic123.html schadet meiner Meinung nach mehr als sie nutzt. Deshalb hab ich viel Probiert und Lösungen gesucht um die URLs abzuschaffen.

1. Die .htaccess

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} /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]

RewriteCond %{REQUEST_FILENAME} /user-([0-9]*).html
RewriteRule (.*) /profile.php?mode=viewprofile&u=%1 [L]
2. Geänderte Links ausgeben
öffne die /includes/page_header.php und f�ge vor

Code: Alles auswählen

//
// Generate logged in/logged out status
//
folgendes ein

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&(?:amp;)start=0"|',
$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;)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-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"|',
$prefix . '(?<!/)viewtopic.php\?t=([0-9]*)&(?:amp;)start=([0-9]*)"|',
$prefix . '(?<!/)viewtopic.php\?t=([0-9]*)"|',
$prefix . '(?<!/)profile.php\?mode=viewprofile&(?:amp;)u=([0-9]*)"|',

);
$urlout = array(
'"forums.html"',
'"forum\\1.html"',
'"viewforum\\1-\\2-\\3.html"',
'"forum\\1.html"',
'"ftopic\\1.html"',
'"ftopic\\1-\\2.html"',
'"ftopic\\1-\\2-\\3-\\4.html"',
'"ftopic\\1.html"',
'"ftopic\\1.html"',
'"ftopic\\1-\\2.html"',
'"ftopic\\1.html"',
'"user-\\1.html"',
);

$s = preg_replace($urlin, $urlout, $s);
return $s;
}
Dann noch in der /includes/page_tail.php nach

Code: Alles auswählen

$db->sql_close();
dashier:

Code: Alles auswählen

//
// ShortURL implementation
//
$contents = ob_get_contents();
ob_end_clean();
echo replace_for_mod_rewrite($contents);
und weiter unten nach

Code: Alles auswählen

$gzip_contents = ob_get_contents();
muss:

Code: Alles auswählen

//
// Short URL implementation
//
$gzip_contents = replace_for_mod_rewrite($gzip_contents);
eingefügt werden.

3. Der Link zum letzten Beitrag
Um statt ptopic123.html eine URL im Stil von ftopic123.html#123 zu erhalten und um doppelten Content zu verhindern muss in der /includes/session.php

Code: Alles auswählen

function append_sid($url, $non_html_amp = false)
{
global $SID;
duch folgenden Code ersetzt werden:

Code: Alles auswählen

function append_sid($url, $non_html_amp = false)
{
global $SID,$HTTP_SERVER_VARS,$db,$board_config;
if( strstr($url,'viewtopic.php') && !strstr($url,'viewtopic.php?replace') )
{
if(ereg("#",$url)) {
$pos=strpos($url, "#");
$url_temp=substr($url,0,$pos);
$zusatz=substr($url,$pos,strlen($url));
$url=$url_temp;
}
else
{
$zusatz="";
}

$found=false;
$found_subject_topic=false;
$found_subject_forum=false;

if( preg_match('#viewtopic.php\?p=#', $url) )
{
$prg=str_replace("viewtopic.php?","",$url);
parse_str($prg, $prg_output);

$sql = "SELECT topic_id
FROM " . POSTS_TABLE . "
WHERE post_id = '".$prg_output['p']."'";
if ($result = $db->sql_query($sql))
{
$row = $db->sql_fetchrow($result);
$prg_output['t'] = $row['topic_id'];

$sql = "SELECT post_id
FROM " . POSTS_TABLE . "
WHERE post_id < '".$prg_output['p']."'
AND topic_id = '".$prg_output['t']."'";
if ($result = $db->sql_query($sql))
{
$c = $db->sql_numrows($result)+1;
if ($board_config['posts_per_page'] < $c)
$prg_output['start'] = floor(($c-1) / $board_config['posts_per_page']) * $board_config['posts_per_page'];
}
if (isset($prg_output['start']))
$url = preg_replace('#viewtopic.php\?p='.$prg_output['p'].'#','ftopic'.$prg_output['t'].'-'.$prg_output['start'].'.html',$url);
else
$url = preg_replace('#viewtopic.php\?p='.$prg_output['p'].'#','/ftopic'.$prg_output['t'].'.html',$url);
unset($prg_output['p']);
}
}
}
Mit diesen Änderungen sollte jedes Topic nur unter einer URL erreichbar sein. Für die Links zum nächsten bzw. vorherigen Beitrag habe ich leider noch keine Lösung gefunden, deshalb emfehle ich die Links einfach komplett rauszuschmeisen, nutzen tut die doch eh nimand.
Heute ist ein guter Tag um dein Forum zu testen.
Ehemaliger Benutzername: [BTK] Tobi
Benutzeravatar
larsneo
Mitglied
Beiträge: 2622
Registriert: 07.03.2002 15:23
Wohnort: schwäbisch gmünd
Kontaktdaten:

Beitrag von larsneo »

wie sieht's mit performance-auswirkungen durch die sql-statements bzw. das preg aus?

btw (und leicht OT): ich finde es ja durchaus löblich, dass du die das phpbb2 in einer suchmaschinenoptimierten version anbietest - aber irgendwie hast du wohl die credits vergessen :roll:
gruesse aus dem wilden sueden
larsneo
..::[krapohl.net]::..
Dave
Mitglied
Beiträge: 2085
Registriert: 25.05.2003 15:03
Wohnort: Wuppertal

Beitrag von Dave »

mal ne frage... wer den einbaut verlinkt auch die urls mit den .html.. wie sieht das aus wenn man nun den mod nimmt? sind dann alle links für den ar...?
The real Indigo
Mitglied
Beiträge: 235
Registriert: 03.08.2004 12:00
Wohnort: Ruhrpott
Kontaktdaten:

Beitrag von The real Indigo »

Meiner Meinung nach reicht der Mod von Larsneo.

Duplicate Content gibt es nicht.

Das Problem ist einfach, dass Google die URL's von Seiten die in der robots.txt gesperrt sind einfach ohne description speichert.
Benutzeravatar
larsneo
Mitglied
Beiträge: 2622
Registriert: 07.03.2002 15:23
Wohnort: schwäbisch gmünd
Kontaktdaten:

Beitrag von larsneo »

Das Problem ist einfach, dass Google die URL's von Seiten die in der robots.txt gesperrt sind einfach ohne description speichert.
und damit auch nicht als DC bewertet...
ich hatte mir das eingangs auch überlegt - aufgrund der notwendigen hacks (inklusive anfälligkeiten) und performance-einbussen dann allerdings nie weiter verfolgt.
gruesse aus dem wilden sueden
larsneo
..::[krapohl.net]::..
Benutzeravatar
tas2580
Ehemaliges Teammitglied
Beiträge: 3029
Registriert: 01.07.2004 05:42
Wohnort: /home/tas2580
Kontaktdaten:

Beitrag von tas2580 »

Ich hab das Ding auf www.gameserveradmin.de laufen, da passt mit der Performance eigentlich alles, das normale mod_rewrite ist etwas lastig, aber die Links zum letzten Beitrag machen jetzt auch nicht so viel mehr aus.
mal ne frage... wer den einbaut verlinkt auch die urls mit den .html.. wie sieht das aus wenn man nun den mod nimmt? sind dann alle links für den ar...?
Versteh ich nicht ganz, das ist der ganz normale MOD von larsneo bei dem einfach noch hinzugefügt wurde das die Links zum letzten Beitrag nichtmehr ptopic... heißen sondern auch ftopic...

Der robots.txt trau ich nicht so ganz, auch wenn es bei einigen zu funktionieren scheint. Die Interne Verlinkung ist auf jeden Fall besser wenn man zur richtigen URL linkt.
Heute ist ein guter Tag um dein Forum zu testen.
Ehemaliger Benutzername: [BTK] Tobi
The real Indigo
Mitglied
Beiträge: 235
Registriert: 03.08.2004 12:00
Wohnort: Ruhrpott
Kontaktdaten:

Beitrag von The real Indigo »

larsneo hat geschrieben:und damit auch nicht als DC bewertet...
Das wollte ich damit ausdrücken... :D
Fundus
Mitglied
Beiträge: 488
Registriert: 29.03.2004 21:22

Beitrag von Fundus »

hat eigentlich schon mal jemand versucht statt der (im shorturl) entfernten GästeSID die Browserkennung als Sessionid zu verwenden (sollte man ja IMO an stelle der krüptischen SID in der phpBB_sessions speichern können)?
es werden ohne die anghängte SID ja immer unzählige Sessions erstellt da der BOT idR keine cookies aktzepiert
Benutzeravatar
larsneo
Mitglied
Beiträge: 2622
Registriert: 07.03.2002 15:23
Wohnort: schwäbisch gmünd
Kontaktdaten:

Beitrag von larsneo »

und was soll das bringen?
(mal abgesehen davon, dass die browser kennung nicht wirklich eindeutig ist - oder benutzen alle deine besucher unterschiedliche browser?)
gruesse aus dem wilden sueden
larsneo
..::[krapohl.net]::..
Fundus
Mitglied
Beiträge: 488
Registriert: 29.03.2004 21:22

Beitrag von Fundus »

larsneo hat geschrieben:und was soll das bringen?
(mal abgesehen davon, dass die browser kennung nicht wirklich eindeutig ist - oder benutzen alle deine besucher unterschiedliche browser?)
ist ja nur für die Sumas gedacht googlebot, slurp usw.

da die sumas ja mit jedem aufruf eine neue session kreieren treiben sie die lastvisit statistik unnötig hoch und blähen die sessiontabelle auf, daher dachte ich wenn ein nichtcookie-user sich als SUMA über die Browserkennung outed diesem dann eine(seine) session zuweisen, wie mit der SID eben auch

zusätzlich könnte man dann bei der erstellung der spezialsession auch noch weitere merkmale festlegen um bei der viewtopic für die den BOT unwichtige links auszublenden, fürs erste gings aber um die einzelne session für den plöden Bot 8)
Antworten

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