THE PROBLEM

我正在管理一个网页,它运行在server hosted by Inmotion和使用PHP 7.2.34.让我们称它为"https://company-website.net/"

在该页面中,我们需要读取一个JSON文件.文件肯定在那里,用户可以打开URL并打开它,json文件位于"https://company-website.net/locale.json""中

从一天到另一天,在January 10th 2024file_get_contents suddenly returned this php error:

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);

I tried something else

我try 设置一个Accept标头,就像它在这个堆栈溢出线程上所说的那样(刚刚将Accept-Language:EN更改为Accept:/: PHP file_get_contents() and setting request headers

因此,代码的结尾如下:

$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);

但什么都没有

THE SOLUTION IN THE END

然后,我最终更改了curl的文件获取内容,如下面的帖子所述: PHP file_get_contents() returns "failed to open stream: HTTP request failed!"

结果是这样的:

$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);

AND IT WORKED.

但我仍然感到困惑的是,为什么它会从一天到另一天停止工作,不确定它是否与PHP的弃用有关,InMotion改变了一些安全方面的东西,真的迷失在这里.我仍然希望try 使用FILE_GET_CONTENTS,并了解问题可能是什么.如果有人能给出任何见解,我将非常感激.

推荐答案

使用PHP 7.2.34

在PHP7中,file_get_contentscurl之间最大的区别是file_get_contents默认使用http/1.0,而curl使用http/1.1.根据返回的406错误,我认为这很可能是原因.(不要觉得奇怪,即使你的请求是通过http/1.0发送的,服务器也可以响应http/1.1错误,请参见此question)

此外,您的curl代码添加了UA,这可能是另一个问题.

try 将这两个项目添加到上下文中:

"protocol_version" => "1.1"
"user_agent" => "Company Name"

Php相关问答推荐

基于验证动态更改输入字段类(名称密码)&

允许Laravel路由指定`withTrashed`,尽管有显式的模型绑定

LaravelEloquent 的地方条件父/子与第三模型多对多

在Woocommerce变量产品中的标签附近显示所选属性选项名称

在WooCommerce我的帐户部分添加带有自定义链接的自定义菜单项

从WooCommerce订单状态更改更新用户自定义元数据

通过访问单个产品页面更新WooCommerce产品元数据

防止同时从Laravel中的用户帐户中提取

是否有条件判断是否发布了另一个Wordpress页面?

将购物车按钮重定向到Checkout-Wooccommerce

Regex|PHP捕获json字符串中的每个非法双引号

simplexml_load_file 和 simplexml_load_string 返回具有不同编码的相同数据

Woocommerce注册中的自定义复选框验证错误提示问题

在这个 Laravel 应用中,如何仅显示已批准的 comments 回复?

Laravel使用另一张表进行关联查询

来自 GoDaddy 的邮箱在 Gmail 中显示为via

使用来自 PHP 表单的数据更新 xml 命名空间

PHP Loop 在迭代中使用修改后的数据

Laravel Websockets 错误:(WebSocket 在建立连接之前关闭)

标头内容类型:image/jpeg 无效