index.html ist define( "INDEX_PAGE", "" ); // Magicquotes magicquotes(); // Name der HTML-Seite, die nicht gefunden wurde $url = isset($_REQUEST['url']) ? $_REQUEST['url'] : ""; if ( strlen($url) > 0 ) { // prüfe, ob es die Datei nicht vielleicht doch gibt if ( is_file($url) ) { header( "Location: ".BASE_DIR.$url ); exit; } // hier ggfs. projektspezifische Weiterleitungen ergänzen // ... // andernfalls: else { // suche nach der Seite; die Seite muss noch als HTML-Seite auf dem Server existieren $pageinfo = searchURL( $url, true ); if ( is_array($pageinfo) ) { $html = array_key_exists( 'html', $pageinfo ) && strlen($pageinfo['html']) > 0 ? $pageinfo['html'] : ''; // wurde eine statische HTML-Seite gefunden und existiert diese? if ( strlen($html) > 0 && is_file(PROJECT_WWW_ROOT.$html) ) { // Weiterleitung mit Statuscode 301 header( "Location: ".BASE_DIR.$html, TRUE, 301 ); exit; } } } } // FJ, 20130730 // ggf. müsste überlegt werden, bei wirklich nicht vorhandenen Seiten // eine 404-Fehlerseite auszugeben; // andererseits sorgt eine Weiterleitung zur Startseite dafür, dass der Traffic // nicht verloren geht // !!! // Default: // Weiterleitung zur Startseite header( "Location: ".BASE_DIR.INDEX_PAGE, TRUE, 301 ); exit; // FJ, 20130730 // sucht nach der übergebenen URL in der htmlsites.db // bei Übergabe $file_must_exists werden nur Einträge zurückgegeben, // wenn auch wirklich die Datei existiert function searchURL( $search_url, $file_must_exists = true ) { $filename = HTML_SITESDB; if ( strlen($search_url) > 0 && is_file($filename) ) { $file = fopen( $filename, "rb" ); if ( FALSE !== $file ) { // Chunk-Datei einlesen // - Chunkhead $typ = fread( $file, 4 ); $version = readInteger( $file ); $chunkcount = readInteger( $file ); $firstchunkpos = readInteger( $file ); if ( $version >= 10002 ) { $indexchunkpos = readInteger( $file ); $indexchunkok = readInteger( $file ); $chunkdelcount = readInteger( $file ); } // gehe zum ersten Datensatz (Chunk) if ( $firstchunkpos ) { $pos = $firstchunkpos; // lese nun nacheinander alle Chunks ein $abbruch = false; while ( !feof($file) && !$abbruch ) { fseek( $file, $pos ); if ( !feof($file) ) { // Chunkkopf lesen $id = readInteger($file); $size = readInteger($file); $version = readInteger($file); if ( false !== $id && $id > 0 && $version == 1 ) { // laden den kompletten Chunk ein $data = fread( $file, $size ); $dpos = 0; $anzahl = readInteger( substr( $data, $dpos,4 ) ); $dpos += 4; // lade nun alle Seiten der htmlsitelist ein for ( $i = 0; $i < $anzahl; $i++ ) { $orid = -1; $elid = -1; $typ = ""; $kdpv1 = ""; $kdpv2 = ""; $historyArray = false; if ( loadHTMLSite( $data, $dpos, $orid, $elid, $typ, $kdpv1, $kdpv2, $html, $historyArray ) ) { // Seite gefunden? if ( $html == $search_url || (is_array($historyArray) && in_array( $search_url, $historyArray ) ) ) { // prüft, ob die Datei existiert if ( !$file_must_exists || is_file(PROJECT_WWW_ROOT.$html) ) { $result = array( 'orid' => $orid, 'elid' => $elid, 'typ' => $typ, 'kdpv1' => $kdpv1, 'kdpv2' => $kdpv2, 'html' => $html, 'history' => $historyArray ); fclose($file); return $result; } } } } // Position des nächsten Datensatzes // - 3 Integer (Id, Size, Version) und DatengröÃe $pos += 3*4 + $size; } else { $abbruch = true; } } } } fclose($file); } } return false; } // FJ, 20130614 // Integerwert aus einer Binärdatei lesen function readInteger( $file ) { if ( is_resource($file) ) { $value = fread( $file, 4 ); if ( !feof($file) && FALSE !== $value ) { return readInteger( $value ); } } elseif ( is_string($file) ) { $value = unpack( "i", $file ); if ( is_array($value) && array_key_exists( 1, $value ) ) { return $value[1]; } } return false; } function magicquotes() { if ( get_magic_quotes_gpc() ) { $_POST = array_map('stripslashes_deep', $_POST); $_GET = array_map('stripslashes_deep', $_GET); $_COOKIE = array_map('stripslashes_deep', $_COOKIE); $_REQUEST = array_map('stripslashes_deep', $_REQUEST); } } function stripslashes_deep($value) { $value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value); return $value; } // FJ, 20130730 // einladen einer HTMLSite function loadHTMLSite( &$data, &$dpos, &$orid, &$elid, &$typ, &$kdpv1, &$kdpv2, &$html, &$historyArray ) { $orid = -1; $elid = -1; $typ = ""; $kdpv1 = ""; $kdpv2 = ""; $html = ""; $historyArray = false; if ( $data ) { $history = ""; // Version der HTMLSite $version = readInteger( substr( $data, $dpos,4 ) ); $dpos += 4; // FJ, 20130729 // Änderung der Datenstruktur von htmlsitesdb // bisher (alt) wurden nur orid, elid, typ, kdpv1, kdpv2 und der statische // HTML-Sseitenname gespeichert // neu wird im ersten Integer die Version gespeichert (darüber wird erkannt, // ob es sich um eine ältere oder neuere htmlsitesdb handelt, denn mit // der PrÜfung $version <= -2 werden alle zulässigen Ordner-IDs ausgeschlossen), // danach folgen orid, elid, typ, kdpv1, kdpv2, der statische HTML-Seitenname // und neu alle historischen Seitennamen if ( $version <= -2 ) { // Ordner-ID $orid = readInteger( substr( $data, $dpos,4 ) ); $dpos += 4; // Elemente-ID $elid = readInteger( substr( $data, $dpos,4 ) ); $dpos += 4; // Typ $laenge = readInteger( substr( $data, $dpos,4 ) ); $dpos += 4; if ( $laenge > 0 ) { $typ = substr( $data, $dpos, $laenge ); $dpos += $laenge; } // kdpv1 $laenge = readInteger( substr( $data, $dpos,4 ) ); $dpos += 4; if ( $laenge > 0 ) { $kdpv1 = substr( $data, $dpos, $laenge ); $dpos += $laenge; } // kdpv2 $laenge = readInteger( substr( $data, $dpos,4 ) ); $dpos += 4; if ( $laenge > 0 ) { $kdpv2 = substr( $data, $dpos, $laenge ); $dpos += $laenge; } // statischer HTML-Seitenname $laenge = readInteger( substr( $data, $dpos,4 ) ); $dpos += 4; if ( $laenge > 0 ) { $html = substr( $data, $dpos, $laenge ); $dpos += $laenge; } // historische Seitennamen; durch Tab \t getrennt $laenge = readInteger( substr( $data, $dpos,4 ) ); $dpos += 4; if ( $laenge > 0 ) { $history = substr( $data, $dpos, $laenge ); $dpos += $laenge; } } else { // alte Version, d.h. im ersten Integer stand die Ordner-ID $orid = $version; // Elemente-ID $elid = readInteger( substr( $data, $dpos,4 ) ); $dpos += 4; // Typ $laenge = readInteger( substr( $data, $dpos,4 ) ); $dpos += 4; if ( $laenge > 0 ) { $typ = substr( $data, $dpos, $laenge ); $dpos += $laenge; } // kdpv1 $laenge = readInteger( substr( $data, $dpos,4 ) ); $dpos += 4; if ( $laenge > 0 ) { $kdpv1 = substr( $data, $dpos, $laenge ); $dpos += $laenge; } // kdpv2 $laenge = readInteger( substr( $data, $dpos,4 ) ); $dpos += 4; if ( $laenge > 0 ) { $kdpv2 = substr( $data, $dpos, $laenge ); $dpos += $laenge; } // statischer HTML-Seitenname $laenge = readInteger( substr( $data, $dpos,4 ) ); $dpos += 4; if ( $laenge > 0 ) { $html = substr( $data, $dpos, $laenge ); $dpos += $laenge; } } // Ordner-ID und Elemente-ID "normalisieren" if ( $orid <= 0 ) $orid = -1; if ( $elid <= 0 ) $elid = -1; // Startordner if ( $orid <= 0 && $elid <= 0 ) { $orid = 1; } // die einzelnen History-Einträge sind durch Tab getrennt $historyArray = strlen($history) > 0 ? explode( "\t", $history ) : false; return true; } return false; } ?>