Prüfen ob externe Seite oder Bild online ist ?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ausgabe
bild
code
datei
fehler
folgendem code
format
funktion
halbe miete
header
http
info
mai
match
status
test
url
verhindern
verzeichnis
weiterleitung
-
Hallo
wie kann ich eine (externe) Link-Adresse prüfen
ob die verlinkte Seite auch online / erreichbar ist ?
ich will damit verhindern, dass jemand eine URL eintragen kann,
die zwar von der Syntax her valide ist, aber eben doch nicht existiert.
also damit sowas:
als "nicht Online" erkannt wird,http://abcdefghijk.de/uvwxyz.htm
und ich somit das Speichern abbrechen / verhindern kann.
auch wenn die URL auf eine .pdf zeigt soll der Link, wenn erreichbar, angenommen werden
das brauche ich dann am besten nochmal extra für Bilder
zum Prüfen, ob hinter der URL eine "erlaubtes" Bild"steckt. (und erreichbar ist)
als Bild würde ich gerne nur die Formate jpg, png und gif akzeptieren
.. .oder was sind noch andere gängige Online Bild-Formate ?
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Danke
ich habe jetzt das hier zusammen bekommen:
<?php // --------------------------------------------------------- function is_url_valide($url) { $valide = true; if(filter_var($url, FILTER_VALIDATE_URL) === false) { $valide = false; } preg_match_all('|^(.*?)://.*|', $url, $matches); if($matches[1][0] != 'http') { $valide = false; } return($valide); } // --------------------------------------------------------- function get_url_status($url) { if (is_url_valide($url) === false) { $http_code = 0; } else { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_NOBODY, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_VERBOSE, false); curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); } return $http_code; } // --------------------------------------------------------- $linkurl = 'http://www.lima-city.de'; $url_status = get_url_status($linkurl); // --------------------------------------------------------- if (empty($url_status) || $url_status == '0') { print "<p>Fehler ... die URL: ".$linkurl." ist nicht VALIDE.</p>\n"; print "<p>Status: ".$url_status."</p>\n"; } elseif ($url_status >= 200 && $url_status < 300) { print "<p>OK ... die Seite: ".$linkurl." ist erreichbar (Online).</p>\n"; print "<p>Status: ".$url_status."</p>\n"; } else { print "<p>NEIN ... die Seite: ".$linkurl." ist NICHT erreichbar.</p>\n"; print "<p>Status: ".$url_status."</p>\n"; } // --------------------------------------------------------- print "<br />\n"; print "<br />\n"; print "<br />\n"; // --------------------------------------------------------- ?>
aber ich bekomme noch eine Fehler-Meldung:
Warning: curl_setopt() ... CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled
Aber wenn ich CURLOPT_FOLLOWLOCATION weg lasse,
dann bekomme ich bei Weiterleitung ja noch nicht die Info,
ob die URL zu der weiter geleitet wird dann auch Online ist ?!
also nur die "halbe Miete" .... :( ... any Ideas ?!
-
thumbshots schrieb:
Du könntest dann den Header "auseinandernehmen" und die neue Location wieder mit dieser Funktion aufrufen.
Aber wenn ich CURLOPT_FOLLOWLOCATION weg lasse,
dann bekomme ich bei Weiterleitung ja noch nicht die Info,
ob die URL zu der weiter geleitet wird dann auch Online ist ?!
also nur die "halbe Miete" .... :( ... any Ideas ?!
-
Erstelle eine ".htaccess"-Datei mit folgendem Code und speichere diese in dem Verzeichnis Deines Scripts ab. Damit deaktivierst Du den safe_mode...
php_value safe_mode off
-
staymyfriend schrieb:
Nette Idee, funktioniert aber eher nicht: Die Dokumentation sagt, dass das nur in der httpd.conf oder php.ini festgelegt werden kann (welchen Sinn hätte das sonst auch?)
Erstelle eine ".htaccess"-Datei mit folgendem Code und speichere diese in dem Verzeichnis Deines Scripts ab. Damit deaktivierst Du den safe_mode...
php_value safe_mode off
-
Du probierst das aber nicht bei Lima-City, oder? Läuft hier nicht PHP 5.4?
-
Hallo
habe jetzt ne Lösung, ... wenn REDIRECT vorhanden, dann Funktion erneut aufrufen.
<?php // --------------------------------------------------------- // ------- Check this URL Status (is online?) ------- $linkurl = 'http://heise.de'; // --------------------------------------------------------- function is_url_valide($url) { $valide = true; if(filter_var($url, FILTER_VALIDATE_URL) === false) { $valide = false; } preg_match_all('|^(.*?)://.*|', $url, $matches); if($matches[1][0] != 'http') { $valide = false; } return($valide); } // --------------------------------------------------------- function get_redirect_url($header) { if(preg_match('/^Location:\s+(.*)$/mi', $header, $m)) { $out = trim($m[1]); } else { $out = ''; } return $out; } // --------------------------------------------------------- function get_url_status($url) { if (is_url_valide($url) === false) { $http_code = 0; } else { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_NOBODY, 1); curl_setopt($ch, CURLOPT_HEADER, 1); ## curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_VERBOSE, false); curl_setopt($ch, CURLOPT_TIMEOUT, 5); $content = curl_exec($ch); $curlnfo = curl_getinfo($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); } if ($http_code > 300 && $http_code < 400) { if(!isset($curlnfo['redirect_url'])) { $curlnfo['redirect_url'] = get_redirect_url($content); } get_url_status($curlnfo['redirect_url']); } return $curlnfo; } // --------------------------------------------------------- function show_url_status($linkurl) { $url_info = get_url_status($linkurl); /* -------- DEBUG -------- print "<br />\n"; print "<pre style=\"margin:6px; padding:4px; background:#DEDEDE; color:#000000; text-align:left;\">\n"; print_r($url_info); print "</pre>\n"; print "<br />\n"; ------------------------- */ $url_status = $url_info['http_code']; $url_redirect = $url_info['redirect_url']; // --------------------------------------------------------- if (empty($url_status) || $url_status == '0') { print "<p>Fehler ... die URL: ".$linkurl." ist nicht VALIDE.</p>\n"; print "<p>Status: ".$url_status."</p>\n"; } elseif ($url_status >= 200 && $url_status < 300) { print "<p>OK ... die Seite: ".$linkurl." ist erreichbar (Online).</p>\n"; print "<p>Status-Code: ".$url_status."</p>\n"; } elseif ($url_status > 300 && $url_status < 400) { print "<p>Naja ... die Seite: ".$linkurl." wird umgeleitet zu ".$url_redirect." (REDIRECT).</p>\n"; print "<p>Status-Code: ".$url_status."</p>\n"; show_url_status($url_redirect); } else { print "<p>NO ... die Seite: ".$linkurl." ist NICHT erreichbar.</p>\n"; print "<p>Status-Code: ".$url_status."</p>\n"; } print "<br />\n"; print "<br />\n"; print "<br />\n"; } // --------------------------------------------------------- show_url_status($linkurl); print "<br />\n"; print "<br />\n"; print "<br />\n"; // --------------------------------------------------------- ?>
bei jedem erkannten REDIRECT wird die Funktion show_url_status neu aufgerufen
und diese ruft wiederum get_url_status auf ... usw ...
bei jdedem REDIRECT also neue Ausgabe ....
man (ich) solte da jetzt vielleicht noch einen Zähler für maximale REDIRECTS einbauen
... aber so funktioniert es schonmal :=) ... ganz doll freu :=)
Ausgabe mit
... siehe TEST$linkurl = 'http://heise.de';
Naja ... die Seite: http://heise.de wird umgeleitet zu http://www.heise.de/ (REDIRECT). Status-Code: 301 OK ... die Seite: http://www.heise.de/ ist erreichbar (Online). Status-Code: 200
PS: ja, ich probiere es auf Lima-City ... siehe TEST
... und auf Lima-City läuft zur Zeit: PHP Version 5.3.21 ... siehe phpinfo()
Umstellung auf PHP 5 kommt wohl Mitte Mai ... siehe Blog: neue-php-version-5-4-im-mai
:)
Beitrag zuletzt geändert: 25.3.2013 22:11:28 von thumbshots -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage