2010-01-06 146 views
1

如果我在PHP中显示URL链接,有什么方法可以在用户点击后检查合法性,以向用户显示一个很好的自定义消息,指出该URL已损坏或类似?在PHP中检查URL是否存在

我不是说错误404页面。我猜404错误只适用于内部网站页面,而不是外部链接。如果我错了,请纠正我。

回答

0

404适用于任何未找到的资源。如果一个链接指向一个链接,那么这个服务器的任务就是不存在这个资源来给你这个消息。引述RFC for HTTP Status Codes

10.4.5 404未找到

服务器没有找到任何匹配 Request-URI中。否 指示 条件是暂时的还是永久性的。 如果服务器通过内部可配置机制 知道旧资源永久为 不可用且没有转发 地址,则应使用410(Gone)状态码为 。当服务器不希望 准确揭示为什么请求有 被拒绝或者没有其他 响应适用时,使用此状态代码通常为 。

此外,单击浏览器中的链接会在PHP完成页面很久之后发生。 PHP是服务器端,而用户交互发生在用户的计算机上与此完全隔离。因此,无法用PHP捕获点击。

如果您想捕获点击(事实上并非如此),您必须将所有外部链接路由到您自己的网络服务器,以便通过get_headers()预取链接以查看资源是否存在。如果没有,您可以将自己的自定义页面呈现给用户。但请记住,这实际上是在执行两个HTTP请求。首先从用户到你的服务器,然后再从服务器到外部网页和你的外部链接很可能是这样的:

http://www.yourserver.com/external.php?url=example.com/someuri 
1

简短的答案是 - 没有。

单击链接会导致用户的浏览器从它所在的服务器请求资源。您的服务器不参与。

可以写一些JavaScript代码解除连接的正常行为,使用Ajax对您的服务器发出请求,让PHP服务器上做出相应的第三方网站的请求,检查响应,响应Ajax请求,然后将location设置为原始URL或一个用于您的错误消息......但这会显着降低用户的性能。

如果您担心您提供的链接被破坏,请定期检查它们。您可以自动执行此操作(例如,使用checklink

1

您应该使用fsockopen先查找链接的响应代码,然后在其显示为小于400时显示它。请参阅http://www.scriptol.com/how-to/http-status-code-in-php.php。也许最好的想法是在断开的链接旁边显示警告(通过CSS或javascript轻松实现)。

+1

手动滚动您自己的HTTP堆栈?使用cURL函数获取头文件不是简单吗? – symcbean 2010-01-06 17:17:58

+1

@symcbean使用内置的get_headers()函数(http://docs.php.net/get_headers)会更加容易。 – Inspire 2010-01-06 17:28:18

4

我的建议:编写一个定期检查URL(使用curl或fsockopen)并将其标记在数据中的PHP批处理作业。通过这种方式,您知道该URL在之前会打破,并将其显示给用户。