2010-08-21 78 views
6

我希望能够验证表单以检查网站/网页是否存在。如果它返回一个404错误,那肯定不应该验证。如果有重定向...我愿意接受建议,有时重定向会转到错误页面或主页,有时会转到您正在寻找的页面,所以我不知道。也许对于重定向,可能会有一个特殊的通知,向用户建议目标地址。如何检查网页是否存在。 jQuery和/或PHP

我找到的最好的事情,到目前为止是这样的:

$.ajax({url: webpage ,type:'HEAD',error:function(){ 
    alert('No go.'); 
}}); 

这与404的和200的,但如果你的URL这样做'http://xyz'它只是挂起没有问题。此外,302等也触发错误处理程序。

这是一个足够通用的问题,我想要一个完整的工作代码示例,如果有人可以做一个。这对很多人来说可能很方便。

+0

我想知道这一点。 – esqew 2010-08-21 03:13:33

+0

通过存在,你的意思是启动和运行,或只是域。 – 2010-08-21 03:24:20

+0

您是否可以重新设计交互,以便可以在不需要用户等待的情况下对URL进行验证? – SargeATM 2010-08-21 03:40:44

回答

3

这听起来像你不关心网页的内容,你只是想看看它是否存在。以下是我如何在PHP中实现它 - 我可以阻止PHP占用页面内容的内存。

/* 
* Returns false if the page could not be retrieved (ie., no 2xx or 3xx HTTP 
* status code). On success, if $includeContents = false (default), then we 
* return true - if it's true, then we return file_get_contents()'s result (a 
* string of page content). 
*/ 
function getURL($url, $includeContents = false) 
{ 
    if($includeContents) 
    return @file_get_contents($url); 

    return (@file_get_contents($url, null, null, 0, 0) !== false); 
} 

为了减少冗长,请用上述函数替换上述函数的内容。

return ($includeContents) ? 
       @file_get_contents($url) : 
       (@file_get_contents($url, null, null, 0, 0) !== false) 
; 

有关如何指定使用流上下文的HTTP头详见http://www.php.net/file_get_contents

干杯。

+0

这是非常简单,它的作品。可能太简单了,因为如果需要,没有办法处理不同的代码。但可能适用于我目前的需求。 – Moss 2010-08-21 05:55:32

+0

您的评论非常感谢。 :-)如果你想切换HTTP代码,那么你必须使用像cURL或套接字这样的机制。套接字很好,因为它们不会在另一个依赖中拖动,并且cURL并且很难配置,但是您不会使用套接字获得本机HTTPS支持。上述方法确实支持HTTPS和许多其他开箱即用的协议(http://us2.php.net/manual/en/wrappers.php)。干杯。 – 2010-08-23 17:22:22

1

首先你需要检查页面是否通过DNS存在。这就是为什么你说它“只是挂起” - 它正在等待DNS查询超时。它并没有真正挂起。

检查DNS后,检查您是否可以连接到服务器。如果你不小心,这是另一个很长的超时时间。

最后,执行HTTP HEAD并检查状态码。在这里你需要考虑许多,很多很多特殊情况:对于存在的页面,“临时内部服务器错误”意味着什么?什么“永久移动”?查看HTTP状态代码。

+0

那么我怎么能用AJAX来检查1和2? – Moss 2010-08-21 06:13:44

+0

@Moss:我会用PHP做它,它很好用,很容易。 JavaScript线程和UI响应是一个问题。 – Borealid 2010-08-21 06:26:43

1

我刚刚写了使用PHP的简单版本:

function url_check($url) { 

$x = @fopen($url,"r"); 

if ($x) { 

     $reply = 1; 

     fclose($x); 

} else { 

      $reply = 0; 

} 

return $reply; 

} 

显然$url是测试URL,返回true(1)或假取决于URL存在(0)。