我正在维护一个在由 Inmotion 托管的 服务器中运行并使用 PHP 7.2.34 的网页。我们将其称为“https://company-website.net/”
在此页面内,我们需要读取一个 JSON 文件。文件肯定在那里,可以转到 url 并打开它,JSON 文件位于“https://company-website.net/locale.json”
日复一日,在2024年1月10日,file_get_contents突然返回了这个php错误:
file_get_contents(https://company-website.net/locale.json):无法打开流:HTTP 请求失败! HTTP/1.1 406 不可接受
代码如下所示:
$fileUrl = 'https://'.$_SERVER['SERVER_NAME'].'/locale.json';
$file = file_get_contents($fileUrl);
我尝试设置一个 Accept 标头,就像在这个堆栈溢出线程上所说的那样(只是将 Accept-Language: en 更改为 Accept: /: PHP file_get_contents() 和设置请求标头
所以,代码是这样结束的:
$fileUrl = 'https://'.$_SERVER['SERVER_NAME'].'/locale.json';
$opts = [
"http" => [
"method" => "GET",
"header" => "Accept: */*"
]
];
$context = stream_context_create($opts);
$file = file_get_contents($fileUrl, false, $context);
但是什么都没有
然后我最终更改了curl的文件获取内容,如该线程中所述: PHP file_get_contents() 返回“无法打开流:HTTP 请求失败!”
所以最终结果是这样的:
$fileUrl = 'https://'.$_SERVER['SERVER_NAME'].'/locale.json';
$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL, $fileUrl);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Company Name');
$file = curl_exec($curl_handle);
curl_close($curl_handle);
并且成功了。
但我仍然很困惑为什么它一天又一天停止工作,不确定这是否与 PHP 弃用有关,Inmotion 改变了安全方面的一些东西,在这里真的迷失了。我仍然想尝试使用 file_get_contents 并了解问题可能是什么。如果有人能提供任何见解,我将非常感激。
使用 PHP 7.2.34
PHP 7 中
file_get_contents
和curl
最大的区别是file_get_contents
默认使用http/1.0,而curl
使用http/1.1。根据返回的406错误,我认为很有可能是这个原因。 (即使你使用http/1.0,服务器仍然会响应http/1.1错误,请参阅这个问题)
另外,你的curl代码添加了UA,这可能是另一个问题。
尝试将这两项添加到上下文中:
"protocol_version" => "1.1"
"user_agent" => "Company Name"