Bekijk Volledige Versie : [PHP] Bestaan van URL checken
E. Spaanbroek
12/01/05, 21:25
Voor een pagina met externe links heb ik een functie die checkt of een
url nog bestaat. Zo niet dan verandert een status in een database en
wordt de url niet meer getoond. Dit werkt voor de meeste urls's.
Nu heb ik een aantal url's waarbij het php-script een 404 - Not Found
geeft, terwijl de url toch bestaat. Tik ik in een console HEAD `url` in,
krijg ik inderdaad een 200 - OK terug voor die url's. Dat snap ik dus
niet. Hoe kan een url benaderd via PHP 404 geven en via de command line
200?
Dit is de functie uit mijn script:
<?
function checkurl($url)
{
$url_parsed = parse_url($url);
$host = $url_parsed["host"];
$port = $url_parsed["port"];
if ($port==0) {
$port = 80;
}
$path = $url_parsed["path"];
if ($url_parsed["query"] != "") {
$path .= "?".$url_parsed["query"];
}
$fp = @fsockopen($host, $port, $errno, $errstr, 15);
if($fp)
{
fputs($fp, "HEAD http://".$host.$path." HTTP/1.0\r\n\r\n");
while(!feof($fp))
{
$check = $check.fgets($fp);
}
$checkstat = strpos(strtolower($check), '404 not found');
if ($checkstat === false) {
return 1;
} else {
return 0;
}
} else {
return 0;
}
}
?>
Is de input bijvoorbeeld http://www.mandarintools.com/chinesename.html,
dan wordt een 0 teruggegeven. De inhoud van $check is dan: HTTP/1.1 404
Not Found Date: Wed, 12 Jan 2005 20:15:10 GMT Server: Apache/1.3.26
Connection: close Content-Type: text/html.
Open ik een console en type HEAD
http://www.mandarintools.com/chinesename.html, dan krijg ik:
200 OK
Connection: close
Date: Wed, 12 Jan 2005 20:17:39 GMT
Accept-Ranges: bytes
ETag: "26ebd9-1f60-41e4b68b"
Server: Apache/1.3.26
Vary: Host
Content-Length: 8032
Content-Type: text/html
Last-Modified: Wed, 12 Jan 2005 05:32:59 GMT
Client-Date: Wed, 12 Jan 2005 20:17:40 GMT
Client-Peer: 207.172.16.151:80
Client-Response-Num: 1
Iemand enig idee hoe dit kan, en beter nog, hoe dit op te vangen?
Alvast bedankt voor het meedenken,
Emile.
E. Spaanbroek schreef:
> Voor een pagina met externe links heb ik een functie die checkt of een
> url nog bestaat. Zo niet dan verandert een status in een database en
> wordt de url niet meer getoond. Dit werkt voor de meeste urls's.
>
> Nu heb ik een aantal url's waarbij het php-script een 404 - Not Found
> geeft, terwijl de url toch bestaat. Tik ik in een console HEAD `url` in,
> krijg ik inderdaad een 200 - OK terug voor die url's. Dat snap ik dus
> niet. Hoe kan een url benaderd via PHP 404 geven en via de command line
> 200?
>
Dat heb ik ook wel eens gezien bij perl-scriptjes die iets vergelijkbaars
doen. Daar blijkt het te liggen aan de gebruikte versie van HTTP: perl
gebruikt blijkbaar achter de schermen HTTP/1.0, terwijl jouw 'head'-
programma wellicht 1.1 gebruikt.
> Dit is de functie uit mijn script:
> <?
> function checkurl($url)
> {
[...]
> fputs($fp, "HEAD http://".$host.$path." HTTP/1.0\r\n\r\n");
>
Ah, inderdaad 1.0.
[...]
> Is de input bijvoorbeeld http://www.mandarintools.com/chinesename.html,
> dan wordt een 0 teruggegeven. De inhoud van $check is dan: HTTP/1.1 404
> Not Found Date: Wed, 12 Jan 2005 20:15:10 GMT Server: Apache/1.3.26
> Connection: close Content-Type: text/html.
>
> Open ik een console en type HEAD
> http://www.mandarintools.com/chinesename.html, dan krijg ik:
> 200 OK
[...]
> Iemand enig idee hoe dit kan, en beter nog, hoe dit op te vangen?
>
Zeker. Ik heb net even gekeken en dit lijkt inderdaad een 1.0 versus 1.1
probleem te zijn: je krijgt een 404 als je 'HEAD <url>/1.0' gebruikt en
een 200 als je 'HEAD <url>/1.1' gebruikt.
Dit is makkelijk te controleren met een tool als SamSpade, zie
<http://www.samspade.org/ssw/> (voor Windows trouwens). En misschien
heeft jouw 'head'-programma ook wel een mogelijkheid om de gebruikte
HTTP-versie te specificeren.
> Alvast bedankt voor het meedenken,
>
Graag gedaan.
Groet,
Wimjan
--
Sleet is van vroeger, tegenwoordig gaat alles kapot.
Daniel Tryba
13/01/05, 00:05
Wimjan <news@inventio.nl> wrote:
> Dit is makkelijk te controleren met een tool als SamSpade, zie
> <http://www.samspade.org/ssw/> (voor Windows trouwens). En misschien
> heeft jouw 'head'-programma ook wel een mogelijkheid om de gebruikte
> HTTP-versie te specificeren.
IPV HTTP 1.1 te gebruiken zou ik ervoor kiezen om 1.0 te gebruiken _met_
de 1.1 Host header.
Rene Pijlman
13/01/05, 00:05
Daniel Tryba:
>IPV HTTP 1.1 te gebruiken zou ik ervoor kiezen om 1.0 te gebruiken _met_
>de 1.1 Host header.
Waarom?
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Daniel Tryba
13/01/05, 00:45
Rene Pijlman <reply.in.the.newsgroup@my.address.is.invalid> wrote:
>>IPV HTTP 1.1 te gebruiken zou ik ervoor kiezen om 1.0 te gebruiken _met_
>>de 1.1 Host header.
>
> Waarom?
>
De meeste kans op zinnige antwoorden.
Rene Pijlman
13/01/05, 00:55
Daniel Tryba:
>Rene Pijlman:
>>>IPV HTTP 1.1 te gebruiken zou ik ervoor kiezen om 1.0 te gebruiken _met_
>>>de 1.1 Host header.
>>
>> Waarom?
>
>De meeste kans op zinnige antwoorden.
Hoezo? Er zijn toch niet of nauwelijks servers die struikelen over HTTP
1.1?
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Daniel Tryba
13/01/05, 01:05
Rene Pijlman <reply.in.the.newsgroup@my.address.is.invalid> wrote:
>>>>IPV HTTP 1.1 te gebruiken zou ik ervoor kiezen om 1.0 te gebruiken _met_
>>>>de 1.1 Host header.
>>>
>>> Waarom?
>>
>>De meeste kans op zinnige antwoorden.
>
> Hoezo? Er zijn toch niet of nauwelijks servers die struikelen over HTTP
> 1.1?
Die paar die er wel zijn worden dan wel bereikt met http/1.0
Daniel Tryba
13/01/05, 01:35
Rene Pijlman <reply.in.the.newsgroup@my.address.is.invalid> wrote:
>>> Hoezo? Er zijn toch niet of nauwelijks servers die struikelen over HTTP
>>> 1.1?
>>
>>Die paar die er wel zijn worden dan wel bereikt met http/1.0
>
> Daar staan de servers tegenover die bezwaar hebben tegen de Host header in
> 1.0. Maar dat zijn er waarschijnlijk ook geen :-)
Ik zou de specs even moet nalezen maar als ze ook maar enigszin zinnig
zijn opgezet worden niet gedefineerde headers in http/1.0 genegeerd (ik
kan met wel herinneren dat in de http 1.1 RFC vermeldt wordt dat het
prettig zou zijn indien http 1.0 servers support zouden bieden voor de
Host header (min of meer de ontwikkelaars die deze legacy servers
onderhouden/implementeren poogt hiertoe te motiveren))
E. Spaanbroek
14/01/05, 10:35
Wimjan wrote:
> E. Spaanbroek schreef:
>
>> Voor een pagina met externe links heb ik een functie die checkt of een
>> url nog bestaat. Zo niet dan verandert een status in een database en
>> wordt de url niet meer getoond. Dit werkt voor de meeste urls's.
>>
>> Nu heb ik een aantal url's waarbij het php-script een 404 - Not Found
>> geeft, terwijl de url toch bestaat. Tik ik in een console HEAD `url` in,
>> krijg ik inderdaad een 200 - OK terug voor die url's. Dat snap ik dus
>> niet. Hoe kan een url benaderd via PHP 404 geven en via de command line
>> 200?
>>
> Dat heb ik ook wel eens gezien bij perl-scriptjes die iets vergelijkbaars
> doen. Daar blijkt het te liggen aan de gebruikte versie van HTTP: perl
> gebruikt blijkbaar achter de schermen HTTP/1.0, terwijl jouw 'head'-
> programma wellicht 1.1 gebruikt.
>
>> Dit is de functie uit mijn script:
>> <?
>> function checkurl($url)
>> {
> [...]
>> fputs($fp, "HEAD http://".$host.$path." HTTP/1.0\r\n\r\n");
>>
> Ah, inderdaad 1.0.
>
> [...]
>
>> Is de input bijvoorbeeld http://www.mandarintools.com/chinesename.html,
>> dan wordt een 0 teruggegeven. De inhoud van $check is dan: HTTP/1.1 404
>> Not Found Date: Wed, 12 Jan 2005 20:15:10 GMT Server: Apache/1.3.26
>> Connection: close Content-Type: text/html.
>>
>> Open ik een console en type HEAD
>> http://www.mandarintools.com/chinesename.html, dan krijg ik:
>> 200 OK
> [...]
>
>> Iemand enig idee hoe dit kan, en beter nog, hoe dit op te vangen?
>>
> Zeker. Ik heb net even gekeken en dit lijkt inderdaad een 1.0 versus 1.1
> probleem te zijn: je krijgt een 404 als je 'HEAD <url>/1.0' gebruikt en
> een 200 als je 'HEAD <url>/1.1' gebruikt.
>
> Dit is makkelijk te controleren met een tool als SamSpade, zie
> <http://www.samspade.org/ssw/> (voor Windows trouwens). En misschien
> heeft jouw 'head'-programma ook wel een mogelijkheid om de gebruikte
> HTTP-versie te specificeren.
>
>> Alvast bedankt voor het meedenken,
>>
> Graag gedaan.
>
>
> Groet,
>
> Wimjan
>
> --
> Sleet is van vroeger, tegenwoordig gaat alles kapot.
Inmiddels is het gelukt dmv http1.1 te gebruiken het script beter
werkend te krijgen.
Bedankt!