• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Umleitungslimit umgehen

jeko

Lounge-Member
In meinem Browser kommt die ganze Zeit ein Fehler nach Aufruf meines Scripts
HTML:
Umleitungslimit überschritten
(So in der Art)
In meinem Script werden halt ziemlich viele Weiterleitungen benutzt. Das Script ruft sich so selbst wieder auf, immer wieder (hat natürlich ein Ende, jedoch kann das unter Umständen erst nach 50-100 Umleitungen kommen).

Habt ihr ne Idee ob ich da was in der Webserverconfig ändern muss oder wie ich das umgehen kann?

Danke leute...
 
das limit wird nicht vom server, sondern vom browser definiert. es sollte funktionieren, wenn du an jeden redirect einen zufälligen teil ranhängst. ich meine sowas:
PHP:
$redirect = "index.php?".rand();
 
Entweder du setzt das time_limit deines Scripts nach oben bzw. schaltest es aus, oder du machst es nach rasputins Vorschlag, dass du einen Counter einbaust und diesen mitübergibst. Ein Zeitlimit überschreitest du, wenn du für den Browser in einer "Endlosschleife" landest...
 
Oder du überlegst dir, ob es überhaupt nötig ist, so viele Weiterleitungen zu benutzen. Ich weiß ja nicht, woran du gerade arbeitest,aber ich glaube ich habe noch nie mehr als zwei Weiterleitungen benutzt.
 
Royalknight, ich denke kaum dass das etwas mit time_limit zu tun hat...

@rasputin: Dein Ansatz hat was... Es ist jedoch so, dass ich bei der Weiterleitung immer eine Variable mitgebe, die sich verändert...

PHP:
$start = "http://".$host;
if (file("SPIDER_interne.txt") != FALSE) {
	$arr = file("SPIDER_interne.txt");
	$passed = $passed+1;
	$start .= $arr[$passed];
	set_time_limit(60);
	echo "<!-- ".$_SERVER['PHP_SELF']."?start=".$start."&first_passed=".$passed." -->";
	header("Location: ".$_SERVER['PHP_SELF']."?start=".$start."&first_passed=".$passed."");
}
else {
	header("Location: ".$_SERVER['PHP_SELF']."?start=STATUS");
}
 
tja, in dem fall wird der querystring vom mozilla nicht beachtet, wenn er die redirects zählt...
da bleibt nur noch ein meta-redirect.
 
jeko schrieb:
Royalknight, ich denke kaum dass das etwas mit time_limit zu tun hat...
Ich hatte mir gedacht du hast ein Script laufen, welches Daten auswertet, dann hättest du meine Möglichkeiten gehabt, aber das scheint mir in diesem Fall nicht so zu sein, deshalb befolge rasputins Vorschlag...
 
Grml...Ich habs mal so probiert wie rasputin gesagt hat... hat nix gebracht... Dann hab ich mir folgendes überlegt:
PHP:
# .htaccess-Datei

# Fix gegen Umleitungslimit
# Format vom Script: /SPIDER/4/2/http://dmoz.org/World/Deutsch/Blub/
# 4 ist eine Zufallsgenerierte Zahl; Zwei ist first_passed; http://...Blub/ ist die nächste URL
RewriteEngine on
RewriteRule ^SPIDER/.*/(.*)/(.*)$ /jswelt-spider.php?start=$2&first_passed=$1

und dann im Script
PHP:
$start = "http://".$host;
if (file("SPIDER_interne.txt") != FALSE) {
	$arr = file("SPIDER_interne.txt");
	$passed = $passed+1;
	$start = $start.$arr[$passed];
	echo "<!-- header('Location: http://"  . $_SERVER["SERVER_NAME"]."/SPIDER/".rand()."/".$passed."/".$start.") -->";
	header("Location: http://" . $_SERVER["SERVER_NAME"]."/SPIDER/".rand()."/".$passed."/".$start."");
}

Aber es gibt immer noch Umleitungslimit...Das Rewrite funzt, seh ich in den logs (mod_rewrite ist natürlich auch geladen).

@ HarryHunt: http://forum.jswelt.de/showthread.php?t=26691

Das ganze Script sieht so aus: (wahrscheinlich ein wenig chaotisch da ich alles schon viele Möglichkeiten für die Lösung des Problems getestet habe)
PHP:
<?php
$EXEC_TIME = time();
set_time_limit(60);

/*
Copyright by. dominique sandoz. jeko@gmx.ch. http://jeko.homelinux.com. 22:17. 01.10.2005.
Für: capi. @forum.jswelt.de.
*/


// Aufruf durch: http://jeko.cwsurf.de/spider.php?start=http://jeko.cwsurf.de/index.php

/*
Aufgabe:
 - Verfolge interne Links (JEDEN und in unendlich Dimensionen)
 - Speichern der HOSTS der EXTERNEN Links in eine MYSQL-DB

*** Interne Links
Kennzeichnung durch * /world/deutsch/ *
OHNE http://dmoz.org/World/Armenian/

*** Externe Links
Kennzeichnug durch
	- DE-Domain (*.de)
	- Links, welche nur aus Hostnamen bestehen und nicht auf explizite Dateien oder Verzeichnisse verweisen


Algorithmen:

n. Durchlauf
Startseite = n.ter Link aus Textdatei
1	-> Quellcode holen
2	-> Alles bis auf Links entfernen
3	-> Interne Links und Externe Links in 2 separate Arrays speichern
4	-> Externe in DB schreiben
4.2		-> Überprüfen ob Link nicht schon drin
5	-> Interne Links in Textdatei schreiben
5.2		-> Textdatei schon vorhanden?
5.3		-> Link schon drin?
5.4			-> Alle internen Links auf Seite in Textdatei?
			JA
5.5				-> Script abbrechen
				-> Textdatei löschen
				-> ENDE DES DURCHLAUFS, ENDE VON SCRIPT
			NEIN
5.5				-> nächster Durchlauf durch aufrufen von spider.php mit start = n+1 . Link in Textdatei
				-> ENDE DES DURCHLAUFS

*/

//DB-Connect

include("datas.php");
$connection=mysql_connect($host,$user,$pw) or die("Verbindung konnte nicht hergestellt werden");
$dbco=mysql_select_db($db, $connection) or die("Datenbank konnte nicht ausgewählt werden");


// zuweisen von wichtigen Variablen
$start_site = $_REQUEST['start'];


if ($_GET['start'] != STATUS) { // wird die STATUSSeite angefragt?


ob_start();

// Host filtern

$host = str_replace("http://","",$start_site);
$host_arr = explode("/",$host);
$host = $host_arr[0];
unset($host_arr[0]);

$host = "dmoz.org";

// Verzeichnis filtern
$verz = array_reverse($host_arr);
unset($host_arr[0]);
$verz = implode("/",$host_arr);
$verz = rawurldecode("/".$verz);

echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head><title>SPIDER - '.$start_site.'-'.date("d.m.Y H:I:s").'</title>
</head>
<body style="background-color:#333; color:#fff;">';

// Prüfen ob Textdatei existiert
if (! isset($_GET['first_passed']) ) {
	if (! file_exists("SPIDER_interne.txt")) {
		$datei = fopen("SPIDER_interne.txt",a);
		if (! $datei || ! fwrite($datei, "Diese Zeile bitte nicht loeschen!\r\n")) {
			die ("<p style='color:#f00'>Konnte Textdatei SPIDER_interne.txt nicht erstellen.</p>");
		}
		else {
			print "<p>Datei SPIDER_interne.txt erstellt.</p>";
		}
		fclose($datei);
	}
	$tabellen = mysql_list_tables("$db");
	$tabellen_zahl = mysql_num_rows($tabellen);
	$ergebnis = 0;
	for ($t = 0; $t < $tabellen_zahl; $t++){
	     if (mysql_tablename($tabellen, $t) == "links"){
	        $ergebnis = 1;
	     }
	}
	if (! $ergebnis) {
		$erg = mysql_query("CREATE TABLE `links` (`name` varchar(254) collate latin1_general_ci NOT NULL default '', PRIMARY KEY  (`name`),	FULLTEXT KEY `name` (`name`)) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;");
		if ($erg) {
			print "<p>Datenbank erstellt</p>";
		}
		else {
			die("<p style='color:#f00;'>Datenbank konnte nicht erstellt werden!</p>");
		}
	}
	set_time_limit(60);
	$passed = 0;
}
else {
	$passed = $_GET['first_passed'];
}
		

echo "<p>$verz</p>\n";
echo "<p>$host</p>\n";


/** 1 Quellcode holen **/

// File lesen und inhalt $content zuweisen
$before = ob_get_contents();
ob_clean();
readfile($start_site);
$content = ob_get_contents();
ob_clean();

// Ausgabe an Benutzer
echo $before;
echo "<p>Location: $start_site <br /> Gelesen...</p><br />";


/** 2 Links von QT trennen **/

$suchstring = '/<a .*href="(.*)".*>.*<\/a>/U';
preg_match_all($suchstring,$content,$treffer);
unset($treffer[0]); // Gesamte Übereinstimmungen löschen, nur den gematchten Ausdruck behalten (Werte in den href-Attributen der Links)

// Doppelte Einträge löschen
$treffer[1] = array_unique($treffer[1]);


/** 3 Externe und interne Links in zwei separate Arrays speichern **/

$externe = array();
$interne = array();

	set_time_limit(60);

foreach ($treffer[1] as $value) {
	if ($value == "/World/Armenian/") {
		continue;
	}
	elseif (substr($value,0,strlen($verz)) == $verz && ! in_array($value."\r\n",file("SPIDER_interne.txt")) ) {
		if (is_writable("SPIDER_interne.txt")) {
			if (!$handle = fopen("SPIDER_interne.txt", "a")) {
				die ("<p style='color:#f00;'>Kann die Datei nicht öffnen (Leserechte?)");
			}
			if (!fwrite($handle, $value."\r\n")) {
				die( "<p style='color:#f00;'>Kann nicht in die Datei schreiben (Schreibrechte?)</p>");
			}
			print "<p style='color:#0f0;'>Interner Link $value in SPIDER_interne.txt geschrieben.</p>\n";
			fclose($handle);
		} else {
			die("<p style='color:#f00;'>Die Textdatei SPIDER_interne.txt ist nicht beschreibbar oder existiert nicht!</p>\n");
		}
		$interne[] = $value;
	}
	elseif (preg_match("/^http:\/\/(.*)\.de\//U",$value,$ext_treffer)) {
		$query = mysql_query("REPLACE links SET name='$ext_treffer[1].de'");
		if ($query) {
			print "<p style='color:#0f0;'>Externer Link $value in Datenbank geschrieben.</p>\n";
		}
		else {
			print "<p style='color:#f00;'>Konnte $value nicht in Datenbank schreiben!</p>\n";
		}
		$externe[] = $value;
	}
}
echo '<pre>';
print_r($interne);
print_r($externe);
echo '</pre>';

echo "<p>Refresh abgeschlossen</p>
</body></html>";


$host = str_replace("http://","",$start_site);
$host_arr = explode("/",$host);
$host = $host_arr[0];

$host = "dmoz.org";

$start = "http://".$host;
if (file("SPIDER_interne.txt") != FALSE) {
	$arr = file("SPIDER_interne.txt");
	$passed = $passed+1;
	$start = $start.$arr[$passed];
	echo "<!-- header('Location: http://"  . $_SERVER["SERVER_NAME"]."/SPIDER/".rand()."/".$passed."/".$start.") -->";
	header("Location: http://" . $_SERVER["SERVER_NAME"]."/SPIDER/".rand()."/".$passed."/".$start."");
}
else {
	header("Location: http://" . $_SERVER["SERVER_NAME"] . $_SERVER["SCRIPT_NAME"]."?start=STATUS");
}


} else { // STATUSSeite wird angefragt

	echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head><title>SPIDER - '.$start_site.'-'.date("d.m.Y H:I:s").'</title>
</head><body>
<h1>Spider-Status</h1>
<p>Hier sind die Einträge der Textdatei mit den internen Links und der Datenbank mit den externen Links</p>
<h2>Interne Links</h2>
<p>Folgenden Links wurde gefolgt</p>';
$files_array = file ('SPIDER_interne.txt');
unset($files_array[0]); // blind- Zeile nicht anzeigen
echo '<ul style="border:1px solid #aaa;">';
foreach ($files_array as $content) {
   echo "<li>".htmlspecialchars($content)."</li>";
}
echo '</ul>
<h2>Externe Links</h2>
<p>Folgende Links wurden als externe Links erkannt und in die Datenbank geschrieben</p>
<ul style="border:1px solid #aaa;">';
$ergebnisse = mysql_query("SELECT * FROM links");
while ($row = mysql_fetch_row($ergebnisse)) {
	echo "<li>$row[0]</li>";
}
echo '</ul>
<p>Spider by Dominique Sandoz</p>
<p><a href="http://validator.w3.org/uri=referer">XHTML valid</a></p>
</body>
</html>';

}


?>
 
Zurück
Oben