validate URL ?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ausgabe
code
dank
fehlermeldung
frage
ftp
funktion
header
http
info
match
protokoll
quatsch
schau
status
string
syntax
test
url
weiterleitung
-
Hallo
anscheinend funktioniert filter_var($url, FILTER_VALIDATE_URL) nicht wirklich,
$url = 'hddb://google.de'; $checkurl = filter_var($url, FILTER_VALIDATE_URL); var_dump($checkurl);
die Ausgabe ist:
string(16) "hddb://google.de"
also würde die Adrese als Valide durchgehen, was ja Quatsch ist ... hddb://
erwartet hätte ich als Ausgabe
bool(false)
alternativ ginge ja auch preg_match mit einem Regex für URLs
aber da finde ich verschiedene Beispiele,
welches regex für URL validate zur Prüfung mit preg_match() würdet Ihr mir empfehlen?
oder besser gleich prüfen, ob URL erreichbar ist ... header-Status oder andere Methode?
---> Wie am besten prüfen, ob URL valide (und erreichbar) ist ?
Danke
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
vielleicht so:
function isValidURL($url) { return preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $url); }
nicht getestet! -
oindex schrieb:
Du hast anscheinend nicht verstanden URLs funktionieren...
Hallo
anscheinend funktioniert filter_var($url, FILTER_VALIDATE_URL) nicht wirklich,
$url = 'hddb://google.de'; $checkurl = filter_var($url, FILTER_VALIDATE_URL); var_dump($checkurl);
die Ausgabe ist:
string(16) "hddb://google.de"
also würde die Adrese als Valide durchgehen, was ja Quatsch ist ... hddb://
erwartet hätte ich als Ausgabe
bool(false)
hddb ist einfach ein Protokoll... ob es das gibt oder nicht ist hier egal, wichtig ist nur, dass es sich um eine valide URL handelt, was ja der Fall ist.
Du möchtest also anscheinend nur wissen, ob es eine http://irgendwas-URL ist...
Das Regex dazu:|^http://(.*)$|
-
du kannst dann ja mit file_get_contents() prüfen ob die datei existiert, da nur im erfolgsfall wirklich ein String entsteht und sonst ein FALSE
-
filter_var ist da sehr weitläuft. Das lässt auch test@test als valide Mailadresse zu. Oben wurde erklärt warum
Du könntest auch nur fragen, ob die URL Existiert:
function url_exists($url) { $f=@fopen( $url , 'r' ); if( $f ) { fclose( $f ); return true; } return false; }
Jenachdem was diese Funktion zurückgibt, existiert die URL oder nicht. Wird denk ich ersichtlich :)
Liebe Grüße -
ggamee schrieb:
Was nicht unbedingt die beste Variante ist, da es in PHP auch ein paar Protokolle gibt, die hier nicht wirklich gefragt sind:
Du könntest auch nur fragen, ob die URL Existiert:
function url_exists($url) { $f=@fopen( $url , 'r' ); if( $f ) { fclose( $f ); return true; } return false; }
Jenachdem was diese Funktion zurückgibt, existiert die URL oder nicht. Wird denk ich ersichtlich :)
ftps, compress.zlib, php, file, glob, data, ftp, phar
Damit könnte der Zugriff auch auf lokale Dateien möglich sein...
Verwend einfach folgenden Code:function validateURL($url) { if(filter_var($url, FILTER_VALIDATE_URL) === false) return(false); preg_match_all('|^(.*?)://.*|', $url, $matches); if($matches[1][0] != 'http') return(false); $curl = curl_init($url); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $data = curl_exec($curl); $status = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); return($status == 200); }
Beitrag zuletzt geändert: 29.4.2012 16:02:49 von hackyourlife -
Danke
ich habe halt angenommen, dass:filter_var($url, FILTER_VALIDATE_URL);
auch erkennt, ob es sich um ein "gängiges" Protokoll handelt, also http:// https:// oder ftp://
aber da wird ja anscheinend "nur" die Syntax geprüft.
daher nehme ich wohl doch lieber ein regex
das von flashzeugs vorgeschlagene habe ich auch irgendwo gefunden,
aber eben auch noch 10 andere, und bevor ich die alle stundenlang ausprobiere,
halt (nochmal) die Frage: .... welches als "gut" bekannt ist, ... getestete Empfehlung(en) ?
das file_get_contents() bzw. die function url_exists($url) { ... } ist auch bestimmt sehr hilfreich
schön wäre halt, wenn ein Status zurück-gegeben wird, also ob 200, 404 oder 301 , etc.
denn eine Webseite mit Fehler kann ja quasi auch immer erreichbar sein, halt als Fehlerseite
aber mitget_headers($url, 1);
bekomme ich bei 404 Fehlerseiten die weitergeleitet werden
den Status 301 ... weil es wohl als Fehlerseite in .htaccess Rewrite steht
BSP:
get_headers('http://www.test.de/blubb/lala.php', 1);
[0] => HTTP/1.1 301 Moved Permanently
kann man das anders Abfragen, damit man in dem Fall doch den Status 404 bekommt ?
-
oindex schrieb:
Schau dir nochmal den leicht veränderten Code an:
Danke
ich habe halt angenommen, dass:filter_var($url, FILTER_VALIDATE_URL);
auch erkennt, ob es sich um ein "gängiges" Protokoll handelt, also http:// https:// oder ftp://
aber da wird ja anscheinend "nur" die Syntax geprüft.
daher nehme ich wohl doch lieber ein regex
das von flashzeugs vorgeschlagene habe ich auch irgendwo gefunden,
aber eben auch noch 10 andere, und bevor ich die alle stundenlang ausprobiere,
halt (nochmal) die Frage: .... welches als "gut" bekannt ist, ... getestete Empfehlung(en) ?
das file_get_contents() bzw. die function url_exists($url) { ... } ist auch bestimmt sehr hilfreich
schön wäre halt, wenn ein Status zurück-gegeben wird, also ob 200, 404 oder 301 , etc.
denn eine Webseite mit Fehler kann ja quasi auch immer erreichbar sein, halt als Fehlerseite
Der Code prüft jetzt ganz einfach ob die URL eine http://irgendwas-URL ist und ob ein Server darauf reagiert.<?php function validateURL($url) { if(filter_var($url, FILTER_VALIDATE_URL) === false) return(false); preg_match_all('|^(.*?)://.*|', $url, $matches); if($matches[1][0] != 'http') // only http is allowed return(false); $curl = curl_init($url); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $data = curl_exec($curl); $status = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); return($status != 0); // 0 = keine Serverantwort } header('Content-Type: text/plain'); echo('ftp: '); var_dump(validateURL('ftp://localhost')); echo('http: '); var_dump(validateURL('http://www.google.com/')); echo('http nonexistent: '); var_dump(validateURL('http://nirvana/')); ?>
Wenn die URL valid ist: true; sonst false
Schau dir die Beispielaufrufe an, um das selbst zu bestaunen.
Und getestet ist das Script; es funktioniert auch perfekt -
hackyourlife schrieb:
Und getestet ist das Script; es funktioniert auch perfekt
Danke,
aber bei Test auf lima-city.de Webspace bekomme ich als Fehlermeldung (Warning)
Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in /home/webpages/lima-city/oindex/html/urlcheck2.php on line 32
habe dann noch bischen zu curl gesucht,
und gefunden, das im HEADER auch die 'redirect_url' steht
function getHttpCode( $url ) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_exec($ch); $info = curl_getinfo($ch); curl_close($ch); return $info; ## return array( $info['http_code'], $info['redirect_url'] ); }
Aufruf
$urls_list = array( 'http://google.de', 'http://www.google.de', 'google.de', 'www.google.de', 'hddb://google.de', 'http://test.de/blubb/lala.php?x=aaa', 'http://www.test.de/blubb/lala.php?x=aaa', 'oindex.lima-city.de', 'http://oindex.lima-city.de', 'ftp://localhost', 'http://www.google.com/', 'http://nirvana/' ); foreach($urls_list as $url) { $hinfo = getHttpCode($url); echo "<br />URL: ".$url."\n"; echo "<br />Status: ".$hinfo['http_code']."\n"; echo "<br />Redirect: ".$hinfo['redirect_url']."\n"; echo "<br />\n"; ## echo "<pre>\n"; ## print_r($hinfo); ## echo "</pre>\n"; }
aber dabei bleibt das Problem bei Weiterleitung (auf 404 Fehlerseite)
die URL: http://test.de/blubb/lala.php hat Status 301 und wird
weitergeleitet zu: http://www.test.de/blubb/lala.php?x=aaa ... also mit www.
prüfe ich direkt http://www.test.de/blubb/lala.php?x=aaa ... bekomme ich Status 404
die URL: http://google.de hat Status 302 und wird
weitergeleitet zu: http://www.google.de ... also mit www.
prüfe ich direkt http://www.google.de ... bekomme ich Status 200
also muss ich jedesmal wenn 'redirect_url' vorhanden ist
nochmal die 'redirect_url' prüfen, um den Status der Ziel-Adresse zu bekommen
... echo "<br />URL: ".$url."\n"; echo "<br />Status: ".$hinfo['http_code']."\n"; if (!empty($hinfo['redirect_url'])) { echo "<br />Redirect: ".$hinfo['redirect_url']."\n"; $hinfo2 = getHttpCode($hinfo['redirect_url']); echo "<br />Redirect Status: ".$hinfo2['http_code']."\n"; } echo "<br />\n"; ...
Weil eine Weiterleitung heisst ja noch nicht OK,
es kann ja eine Weiterleitung zu einer Fehlerseite sein ....
und für den Fall, das eine Weiterleitung wieder eine Weiterleitung ist
bräuchte ich da wohl eine while() Schleife,
... auch um z.B. ab 3x redirect die URL zu blocken, oder wieviele sind noch OK?
PS:
komisch, das ein "normaler" .htaccess Rewrite wie index.php?name=horst als horst.html anzeigen
gleich Status 200 hat und keine Info zum Rewrite, so wie bei mit www. Rewrite bei test.de ?!
... naja, keine Ahnung wie bei test.de der Rewrite gelöst ist, htaccess oder header(Location) in PHP
-
oindex schrieb:
Hab wohl vergessen dass auf lima-city einiges anders funktioniert und das Script nur lokal getestet
hackyourlife schrieb:
Und getestet ist das Script; es funktioniert auch perfekt
Danke,
aber bei Test auf lima-city.de Webspace bekomme ich als Fehlermeldung (Warning)
Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in /home/webpages/lima-city/oindex/html/urlcheck2.php on line 32
Veränder doch die Funkton so:
Die Zeile mit CURLOPT_FOLLOWLOCATION einfach entfernt...function validateURL($url) { if(filter_var($url, FILTER_VALIDATE_URL) === false) return(false); preg_match_all('|^(.*?)://.*|', $url, $matches); if($matches[1][0] != 'http') // only http is allowed return(false); $curl = curl_init($url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $data = curl_exec($curl); $status = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); return($status != 0); // 0 = keine Serverantwort }
So bekommst du direkt die Statuscodes, was dein Problem beheben könnte...
Wenn du also eine Weiterleitungsseite aufrufst bekommst du auch den Weiterleitungscode, egal wohin weitergeleitet wird...
Wenn das nicht das ist was du wolltest erklär bitte nochmal was bei den Weiterleitungen wie passieren sollte... -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage