search check home clock-o tag tags chevron-left chevron-right chevron-up chevron-down twitter facebook github rss comment comments terminal code

[PHP]Jak sprawdzić nie działający adres URL?

[PHP]Jak sprawdzić nie działający adres URL?

Postanowiłem napisać krótki artykuł o tym, jak sprawdzić nie działający adres URL?
Uważam, że jest to przydatne rozwiązanie, bo dzięki temu możemy uniknąć problemów z dotarciem do treści na stronie.
Skrypt ten opiera się na bibliotece cURL znajdującej się standardowo w większości serwerów obsługujących PHP. Co będzie można zobaczyć w dalszej części artykułu.

Zasada jest prosta. Najpierw tworzymy formularz w HTML, który będzie nam służył do wprowadzania danych strony www do sprawdzenia:

<form action="broken-url.php" method="post">
   <label for="url"><span>Wpisz adres strony (bez http://):</span><input type="text" name="url" /></label>
   <label><input type="submit" name="submit" value="Wyślij" /></label>
</form>

Teraz należałoby napisać funkcję, która będzie sprawdzała czy link jest prawidłowy. Funkcja wygląda następująco:

function sprawdz($url)
{
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_URL, $url);
	curl_setopt($curl, CURLOPT_HEADER, 1);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
	$data = curl_exec($curl);
	$naglowki = curl_getinfo($curl);
	curl_close($curl);
	return $naglowki['http_code'];
}

Ostateczny wygląd kodu takiego narzędzia do sprawdzania linków wygląda następująco:

< ?php
function sprawdz($url)
{
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_URL, $url);
	curl_setopt($curl, CURLOPT_HEADER, 1);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
	$data = curl_exec($curl);
	$naglowki = curl_getinfo($curl);
	curl_close($curl);
	return $naglowki['http_code'];
}
if(!isset($_POST['submit'])) {
?>
<form action="broken-url.php" method="post">
   <label for="url"><span>Wpisz adres strony (bez http://):</span><input type="text" name="url" /></label>
   <label><input type="submit" name="submit" value="Wyślij" /></label>
</form>
< ?php
}
else {
	$url = $_POST['url'];
	$powrot = '<br/>Wróć do formularza';
	if(!filter_var($url, FILTER_VALIDATE_URL)) {
		$stan = sprawdz($url);
		if($stan == '200') {
			echo 'Link jest prawidłowy i działa.'.$powrot;
		}
		else
			echo 'Link nie istnieje!'.$powrot;
	}
	else
		echo 'Podano błędny adres URL.'.$powrot;
}
?>

W dodatkowym kodzie, który służy tu do sprawdzania czy dane zostały wysłane, zastosowałem funkcję sprawdzającą poprawność linków, która została zaimplementowana w PHP w wersji 5.2 i wyżej - filter_var($url, FILTER_VALIDATE_URL). Jest to bardzo użyteczna metoda na sprawdzenie czy link jest prawidłowy. Dzięki temu unikamy obciążenia serwera związanego z przetwarzaniem standardowych wyrażeń regularnych w celu sprawdzenia poprawności adresu. Poza tym, jest ona wygodniejsza.

Demo z tego artykułu można zobaczyć pod tym adresem: PHP sprawdzenie adresów www.
Mam nadzieję, że ten artykuł okaże się dla Ciebie przydatny.

  • Radek

    Takie kody http jak 301 chyba też powinny być uznawane jako poprawne? lub skrypty powinien podążać za przekierowaniami?

  • Trafna uwaga. Można ten skrypt rozbudować o sprawdzenie także tego stanu.
    Wtedy zamiast:

    if(stan=='200') {
    

    Należałoby wpisać:

    if($stan == '200' || stan == '301') {
    
  • Mateusz Niezgoda

    Spoko – wg. Twojego skryptu NK nie istnieje, gógle też nie 🙂
    Tak BTW. zrobiłbym to AJaX i ew. jak ktoś nie ma to PHP, bo po co obciążać serwer ?
    W adresie Request AJaX wrzuciłbym to co ktoś wpisał – większe bezpieczeństwo i skrypt by działał 🙂

  • Zaskakujące. Rzeczywiście nie działa dla NK. Spróbuję się dowiedzieć dlaczego.

  • Mateusz Niezgoda

    Bardzo prawdopodobne, że NK ma ustawiony serwer w taki sposób, że wywołania przez cURL nie działają – ustaw sobie, żeby w header wysyłało jakąś przeglądarkę i jakiś system 🙂

  • Comandeer

    Odnośnie NK to rzeczywiście blokuje dostęp dla żądania bez nagłówków User-Agent i Accept-Charset. Wystarczyło się przedstawić jako Chrome i voila – udało się nawet zalogować i pobrać listę zdjęć danego usera ;D.

  • Przykład bardzo fajny. Jednak należałoby trochę go dopracować tak jak wspomnieli inni użytkownicy w komentarzach.

    Skrypcik można wykorzystać (po modyfikacji) np do badania linków zwrotnych 😉

    Pozdrawiam.

  • Luke

    Wpisz adres strony (bez http://):

    Te spany możnaby pominąć dając oddzielnie label, a obok input. Wtedy stylujesz label i span niepotrzebny.

  • Crazy

    Należałoby sprawdzić czy sprawdzany URL nie przekierowuje na własną stronę 404, wtedy zawsze serwer sprawdzany będzie zwracał 200.

  • Dobry pomysł, wtedy trzeba sprawdzić inny komunikat niż 200.