【问题标题】:Ensure URL points to a real location?确保 URL 指向真实位置?
【发布时间】:2011-08-10 13:57:14
【问题描述】:

我已经完成了这个 CMS 的小事,用户可以在提交之前预览帖子。我想要一个功能来检查输入的 URL 是否有效(即指向存在的资源,而不是它的格式是否正确)。最好,我想用 JavaScript 来做(那时我不必使用 AJAX 和 PHP),但 PHP 很好。

有人可以指出我这样做的方法吗?以防万一,我想要运行 UNIX ping 命令之类的是/否响应。我不关心 URL 的另一端是什么,只关心它是否真的指向可导航的东西。

谢谢,

詹姆斯

【问题讨论】:

  • 使用 cURL 发送 HEAD 请求。您需要设置激进的超时时间。

标签: php url exists


【解决方案1】:

您可以简单地使用 fopen 来查看 url 是否可以工作......当然,这可能是资源过度杀伤,具体取决于您执行此操作的频率。

http://php.net/manual/en/function.fopen.php

或者,您可以使用 jquery 插件:

http://binarykitten.me.uk/dev/jq-plugins/88-jquery-plugin-ajax-head-request.html

另一种方法,可能是最简单的方法,但您可以使用 jquery 调用另一个实现它的 php 脚本:

http://php.net/manual/en/function.get-headers.php

【讨论】:

  • 感谢您的回复。我选择了 jQuery 路径,但您介意告诉我如何让该插件返回真/假值,以便我可以选择是否显示消息?非常感谢。
  • 如果您遍历标头并查找特定的 http 状态代码 200 = OK、304 = 缓存等。这里是代码列表:en.wikipedia.org/wiki/List_of_HTTP_status_codes
  • 谢谢你,但是,我返回的唯一标题是:Date:--:Thu, 21 Apr 2011 20:33:09 GMT Server:--:Apache/2.2.17 ( Ubuntu) X-Powered-By:--:PHP/5.3.5-1ubuntu7 Expires:--:Thu, 19 Nov 1981 08:52:00 GMT Cache-Control:--:no-store, no-cache, must -revalidate, post-check=0, pre-check=0 Pragma:--:no-cache Vary:--:Accept-Encoding Content-Encoding:--:gzip Content-Length:--:2860 Keep-Alive: --:timeout=15, max=95 Connection:--:Keep-Alive Content-Type:--:text/html 请原谅没有换行符:-(
  • 没问题。尝试一个不存在的位置。比较差异?它应该是响应标头中的第一行。 web-sniffer.net ..
  • 顺便说一下,低于 399 的标头状态通常是一个很好的指示,因此您的代码如下所示:if(status>399)alert("error");
【解决方案2】:

将其加载到新的img 对象中,然后查看响应是什么。由于您实际上并未显示图像,因此您可能正在加载纯文本或其他非图像数据这一事实几乎无关紧要,您只想查看图像请求的 HTTP 状态代码是什么。

这样做的好处是,如果恶意用户试图加载指向一个非常大的文件的 URL,他们只会拒绝自己,因为请求会从他们的浏览器而不是您的服务器发出。不利的一面是,没有什么能阻止他们欺骗正确的响应,并且仍然会投入大量资源并提交表单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-02
    • 2019-10-20
    • 2014-05-14
    • 1970-01-01
    • 2013-08-11
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多