Seite 42 von 131

Problem: Short URLs und UPItoDB MOD

Verfasst: 18.06.2004 21:17
von m0bby
Hallo,

ich habe ein Problem in meinem Board beobachtet, bei dem ich nicht weiter komme.
Ich habe den "Unread Post Information to Database" MOD (UPItoDB) zusammen mit dem Short URLs MOD installiert.
Beim UPItoDB MOD werden alle von einem User gelesen Topic-IDs in einer Datenbank gespeichert. Dies geschieht in der viewtopic.php

Code: Alles auswählen

    if( $userdata['session_logged_in'] )
    {
        $user_id = $userdata[user_id];
        $post_id = $postrow[$i]['post_id'];
        $post_time = $postrow[$i]['post_time'];
        $post_edit_time = $postrow[$i]['post_edit_time'];
        $post_new = "";
        // $zeit_min_monat = time() - 2592000;
        $zeit_jetzt = time();
        $zeit_monat = $zeit_jetzt - 2592000;
        if ($post_time > $zeit_monat || $post_edit_time > $zeit_monat)
        {
            if ($visit_time < $post_time || $visit_time < $post_edit_time)
            {
                $post_new = "bgcolor=\"#ffffcc\"";
                
                if ( $post_id == $last_post_id || $visit_time < $post_edit_time)
                {
                    $sql = "DELETE FROM " . TOPIC_READ_TABLE . "
				        WHERE topic_id = $topic_id
			  		    AND user_id = $user_id";
                    
                    if (!$result = $db->sql_query($sql) )
                    {
                        message_die(GENERAL_ERROR, "Couldn't remove Topic Read database", "", __LINE__, __FILE__, $sql);
                    }
                    $visit_time_new = time();
                    
                    $sql = "INSERT INTO " . TOPIC_READ_TABLE . " (topic_id, post_id, user_id, visit_time, forum_id) VALUES ('$topic_id' , '$post_id' , '$user_id' , '$visit_time_new', '$forum_id')";
                    if (!$result = $db->sql_query($sql) )
                    {
                        message_die(GENERAL_ERROR, "Couldn't Build Topic Read database", "", __LINE__, __FILE__, $sql);
                    }
                }
            }
        }
    }
Das klappt auch ganz gut - auch zusammen mit dem Short URLs MOD. Aber leider nur solange ich mit dem Internet Explorer unterwegs bin. Wenn ich den Mozialla Firefox benutze passiert etwas seltsames:
Es wird zusätzlich zu der richtigen Topic-ID noch eine weiter Topic-ID in die Datenbank geschrieben. Und zwar genau die Topic-ID des nächst neueren Topics aus dem gleichen Forum. :-?

Ich hatte zunächst natürlich den UPItoDB MOD in Verdacht, der Übeltäter zu sein. Das hat sich aber nicht bestätigt. Ich habe herausgefunde, das der Fehler nur Auftritt, wenn in der page_tail.php die Funktion 'replace_for_mod_rewrite' aufgerufen wird.

Code: Alles auswählen

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;
}

Wenn ich die Zeile

Code: Alles auswählen

    $s = preg_replace($urlin, $urlout, $s);
in der Funktion auskommentiere tritt der Fehler nicht auf.
Und wie gesagt, er Fehler tritt nicht mit dem IE auf. :o
Es ist auch egal, ob Gzip ein- oder ausgeschaltet ist.

Aber wie kann das denn sein???

Was passiert beim Firefox, was beim IE keine Auswirkungen hat?

Hat jemand eine Idee?


Schönen Gruß
mObbY

Verfasst: 19.06.2004 13:04
von m0bby
Hat denn keiner eine Idee, wieso dieser 'preg_replace'-Befehl beim Firefox zu dem beschriebenen Fehler führt und beim IE nicht?
:(

Gruß
mObbY

Verfasst: 20.06.2004 23:15
von m0bby
Problem gelöst.
Schuld ist die Prefetching Funktion einiger Browser. Weiter Infos hier:
http://www.phpbb.de/topic35825.html

Schönen Gruß
mObbY

Verfasst: 20.06.2004 23:18
von Christian_W
Boah, ich hab jetzt fast alles dieser über 40 Seiten gelesen.
Ich weiß noch nicht recht ob ich das ganze überhaupt mache aber ich hatte ein Problem mit den short-urls das evtl. anderen auch helfen kann.
Mein Provider macht die subdomains auch mit URL-Rewriting. Ich lege einfach ein Verzeichnis domain.de/forum an und kann es dann unter forum.domain.de aufrufen.
In der .htaccess gibt es ja den Teil:

Code: Alles auswählen

RewriteCond %{REQUEST_FILENAME} /forum([0-9]*).*
RewriteRule (.*) /viewforum.php?f=%1 
Da dadurch forum doppelt belegt ist kommt es zu einem ERROR 500.
Lösung:
Entweder keine Subdomain forum benutzen.
Oder in der .htaccess und allen zugehörigen Änderungen anstelle von forum z.B. showforum benutzen (viewforum geht nicht weil das ja auch schon benuzt wird)

Gruß Christian

Verfasst: 22.06.2004 12:51
von Destruktor
Ich habe es bei mir so, dass man beim Aufruf der Seite forum.domain.de einfach auf den Ordner domain.de/forum weitergeleitet wird.

http://forum.wsv-verden-jugend.de

Klappt bei mir ganz gut.. 8)

Verfasst: 22.06.2004 23:19
von m0bby
Christian_W hat geschrieben: In der .htaccess gibt es ja den Teil:

Code: Alles auswählen

RewriteCond %{REQUEST_FILENAME} /forum([0-9]*).*
RewriteRule (.*) /viewforum.php?f=%1 
Da dadurch forum doppelt belegt ist kommt es zu einem ERROR 500.
Lösung:
Entweder keine Subdomain forum benutzen.
Oder in der .htaccess und allen zugehörigen Änderungen anstelle von forum z.B. showforum benutzen
Oder statt

Code: Alles auswählen

RewriteCond %{REQUEST_FILENAME} /forum([0-9]*).* 
dieses hier schreiben:

Code: Alles auswählen

RewriteCond %{REQUEST_FILENAME} /forum([0-9]+).* 
Dann kannst du weiterhin ein Verzeichnis "forum" benutzen.

Schönen Gruß
mObbY

Verfasst: 23.06.2004 11:58
von Eistee
@larsneo

Deine Modifikation mit dem $prefix soll doch dazu da sein, dass auch vollständige Links (z.b. http://www.domain.de/viewtopic.php?p=xxx in einem Posting) umgeschrieben werden? Das funktioniert aber nicht...

Verfasst: 23.06.2004 14:59
von Christian_W
@m0bby
Ich habe auch noch andere Lösungen gefunden. In erster Linie ging es darum auf mögliche Probleme hinzuweißen und schonmal einen Tipp zu geben wie man es evtl. lösen könnte.
Ich selbst bau das wahrscheinlich sowieso nicht ein. ;)
Trotzdem Danke für den Tipp der sicher dem ein oder anderen hilft.

Gruß Christian

Verfasst: 23.06.2004 21:49
von larsneo
@Eistee:
die prefix geschichte ist eigentlich dafür da, dass lediglich verweise auf die eigene seite beim konvertieren des output-buffer vor der ausgabe umgeschrieben werden - ansonsten könnten sonst ja ggfs. auch normale urls aus beiträgen angepasst werden.

Verfasst: 26.06.2004 18:40
von hmueller
Hallo,

hab' gerade in meinem Error-Log jede Menge Einträge mit folgendem Muster gefunden:

Code: Alles auswählen

mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary.
File does not exist: /is/(...)/forum2/404.htm
Was hat das zu bedeuten?
mod_rewrite funktioniert eigentlich

====

zweitens: sehe gerade an meinem Error-Log, daß sich einige User im Forum immer noch mit .php und angehängter SSID bewegen. Andere wiederum nicht.
An was kann das liegen?


====

@Mods: könnte man denn diesen Monster-Thread nicht irgendwie mal zusammenfassen (KB...) und einen neuen oder mehrere neue Threads aufmachen? Das ist mittlerweile ziemlich unübersichtlich hier.