【问题标题】:Unable to access outside URL using file() function in PHP无法使用 PHP 中的 file() 函数访问外部 URL
【发布时间】:2013-07-22 02:42:07
【问题描述】:

我有以下代码:

$url = 'http://' . $host . ':' . $port . $params;
$results = file( $url );

我收到以下异常:

file(http://someurl.com/asd/asd): failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden

但我直接在浏览器中访问 URL(存储在 $url 变量中),它工作得很好。为什么我从 PHP 访问它时遇到问题?

【问题讨论】:

  • URL 文件访问可能在服务器配置 (php.ini) 中被禁用 --> allow_url_fopen = Off (更改为 On)
  • @0xBAADF00D 我认为这是一条不同的错误消息...他正在访问的服务器可能与他的 UA 字符串或服务器 IP 有问题。可能是某种反机器人措施
  • 作为对@0xBAADF00D 的补充,如果您不发送用户代理,可能会被阻止,请尝试cURL
  • @Orangepill 尝试使用 "wtf" 用户代理从 cURL 访问 url: curl -A "kljslkdfjslfjdsklfjsldkf" http://... 以查看服务器是否阻止未知用户代理。
  • @0xBAADF00D 认为应该去 Awan :)

标签: php apache file url httpforbiddenhandler


【解决方案1】:

这个错误信息:

HTTP/1.0 403 禁止

...实际上直接来自您尝试访问的服务器。所以 PHP 出来访问外部文件不是问题。

这更像是一个说服服务器实际将文件提供给您的问题,就像它会将文件提供给网络浏览器一样。

我要检查几个问题:

  1. 文件是否受密码保护? Web 浏览器会保存您输入的密码,并允许您重新访问 URL 而无需再次输入密码,但 PHP 不知道该使用什么密码。

  2. 也许服务器通过检查用户代理字符串来限制非浏览器的访问?

  3. 除非您从同一站点的另一个页面引荐,否则服务器可能会限制访问?

您可以尝试使用online HTTP header viewer tool 尝试直接请求文件。您可以尝试不同的标头、用户代理等,看看是否可以重现问题。

如果我不得不猜测,我的钱将用于第一个问题 - 需要密码。但是,如果不知道实际的 URL,就无法知道。


如果您确实知道是什么阻止您访问该文件,您应该阅读http wrapper、流contexts,尤其是http stream context options,以了解如何设置缺少的信息php。有多种方法可以指定密码、用户代理、引用标头,甚至是您想要的任何随机 HTTP 标头。

【讨论】:

    猜你喜欢
    • 2013-05-20
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    相关资源
    最近更新 更多