为啥在使用 file_get_contents() 时出现 500 错误,但在浏览器中有效?

Posted

技术标签:

【中文标题】为啥在使用 file_get_contents() 时出现 500 错误,但在浏览器中有效?【英文标题】:Why I'm getting 500 error when using file_get_contents(), but works in a browser?为什么在使用 file_get_contents() 时出现 500 错误,但在浏览器中有效? 【发布时间】:2012-05-18 11:30:23 【问题描述】:
$html = file_get_contents("https://www.[URL].com"); 
echo $html;

在错误日志中生成:

php 警告:file_get_contents(https://www.[URL].com) [function.file-get-contents]:打开流失败:HTTP 请求失败!第 13 行 /Applications/MAMP/htdocs/test.php 中的 HTTP/1.1 500 内部服务器错误";

但是,该网站在浏览器中运行良好。

我也尝试过使用 cURL。我在日志文件中没有收到任何错误,但 $html 现在回显:

“/”应用程序中的服务器错误。 对象引用未设置为对象的实例。

...更多调试信息

任何想法如何解决这个问题?

【问题讨论】:

您是否考虑过询问托管其他网站的人? 【参考方案1】:

试试这个解决方法:

$opts = array('http'=>array('header' => "User-Agent:MyAgent/1.0\r\n"));
$context = stream_context_create($opts);
$header = file_get_contents('https://www.example.com',false,$context);

如果这不起作用,也许您无法从 https 读取?

【讨论】:

有趣的解决方案。但是,当我将用户代理更改为 Chrome 时,我现在收到 400 错误。不过,使用“MyAgent”字符串效果很好。 谢谢 - 它有效,但我很好奇为什么它有效。有什么具体的理由吗? @DanSmart PHP 的默认用户代理(很可能只是一个空白字符串)被您从中请求网页的 Web 服务器阻止。这就是为什么你可能需要设置一个虚假的用户代理。 原因是 web 应用程序在处理 User-Agent 标头时出错。例如,他们的数据库在插入 NULL User-Agent 时出错。 @modu 有没有办法默认取消阻止?因为 php.ini 中的 allow_url_open 不起作用,谢谢【参考方案2】:

我必须在标题中输入更多数据:

$opts = array('http' => array(
    'method' => "GET",
    'header' => "User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0\r\n"
    . "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
    . "Accept-Encoding:gzip, deflate\r\n"
    . "Accept-Language:cs,en-us;q=0.7,en;q=0.3\r\n"
    . "Connection:keep-alive\r\n"
    . "Host:your.domain.com\r\n"
    ));
$context = stream_context_create($opts);
$html = file_get_contents($sap_url, FALSE, $context);

【讨论】:

以上是关于为啥在使用 file_get_contents() 时出现 500 错误,但在浏览器中有效?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 file_get_contents 不起作用?

为啥我在网络活动下的 firefox 和 chrome 开发工具中看不到 file_get_contents 请求?

php __destruct 为啥通过 file_get_contents 得到不同的结果

php 编程,使用file_get_contents('http://www.vketch.com/')获取远程页面超时为啥不会返回false

file_get_contents() 不工作

如何使用 file_get_contents 在 PHP 中发布数据?