gpt4 book ai didi

php - 使用 Guzzle 但不是通过浏览器或命令行 cURL 或 wget 时出现 406

转载 作者:搜寻专家 更新时间:2023-10-31 20:35:03 24 4
gpt4 key购买 nike

我们有一个使用 Guzzle 5 来下载 Wordpress RSS 提要的 php 网络应用程序。

它工作正常,除了这个 feed https://www.socialquant.net/blog/feed/

该网站的所有者确实希望我们拉取 feed,而不是故意试图阻止访问。

我可以使用 wgetcurl 从本地计算机和生产 Web 服务器(我们最初注意到问题的地方)成功下载文件,无需特殊选项。

这之前发生过一次,当时我们认为问题是由 Apache 上的 mod_security 引起的,通过添加任意 User-Agent header 解决了这个问题。但那一次我能够在命令行上一致地重现问题,这次它只是通过 Guzzle/PHP 失败了

我已将响应 header 从浏览器请求复制到问题提要,以及另一个有效的提要。我划掉了那些相同的,剩下的是下面的

Server:Apache/2.2.22
Vary:User-Agent
X-Powered-By:PHP/5.3.29
Content-Encoding:gzip

Server:Apache
Vary:Accept-Encoding
X-Powered-By:PHP/5.5.30

这并没有提供太多的见解。 gzip 内容编码跳出,我试图找到另一个使用 gzip 的工作提要来验证这一点,但这无关紧要,因为 Guzzle 的默认模式是自动处理编码。我们使用相同的设置从使用 gzip 的 CDN 下载图像。

有人有什么想法吗?谢谢:)

编辑

使用 Guzzle 5.3.0

代码:

$client = new\GuzzleHttp\Client();

try {
$res = $client->get( $feed, [
'headers' => ['User-Agent' => 'Mozilla/4.0']
] );
} catch (\Exception $e) {

}

最佳答案

恐怕我没有适当的解决方案来解决您的问题,但我让它再次起作用。

tl;dr 版本

这是 User-Agent header ,将其更改为几乎任何其他内容都有效。

wget 调用失败:

wget -d --header="User-Agent: Mozilla/4.0"  https://www.socialquant.net/blog/feed/ 

但这行得通

wget -d --header="User-Agent: SomeRandomText" https://www.socialquant.net/blog/feed/

这样,下面的 PHP 现在也可以工作了:

require 'vendor/autoload.php';

$client = new \GuzzleHttp\Client();
$feed = 'https://www.socialquant.net/blog/feed/';

try {

$res = $client->get(
$feed,
[
'headers' => [
'User-Agent' => 'SomeRandomText',
]
]
);
echo $res->getBody();
} catch (\Exception $e) {
echo 'Exception: ' . $e->getMessage();
}

我的想法

正如您所指出的,我从 wgetcurl 开始,这在没有设置特殊 header 或选项时有效。在我的浏览器中打开它也有效。我还尝试在未设置 User-Agent 的情况下使用 Guzzle,这也有效。

一旦我将 User-Agent 设置为 Mozilla/4.0 甚至 Mozilla/5.0 它就开始失败并显示 406 Not Acceptable

根据HTTP Status Code definitions , 406 表示

The resource identified by the request is only capable of generating response entities which have content characteristics not acceptable according to the accept headers sent in the request.

理论上,添加AcceptAccept-Encoding header 应该可以解决问题,但事实并非如此。不是通过 Guzzle 或 wget

然后我找到了 Mozilla Developer Network definition其中指出:

This response is sent when the web server, after performing server-driven content negotiation, doesn't find any content following the criteria given by the user agent.

这有点指向 User-Agent。这让我相信你确实是正确的,mod_security 正在做一些奇怪的事情。我确信客户端服务器上的 mod_security 或 Apache 更新添加了一条规则,以特定方式解析 Mozilla/* 用户代理,因为发送了 User-Agent: Mozilla/4.0 ( ) 也有效。

这就是为什么我说我没有适合您的解决方案。即使客户希望您拉取提要,他们(或他们的主机)仍然控制着规则。

注意:我注意到我的 IP 在多次 406 尝试失败后被列入黑名单,之后我不得不等待一个小时才能再次访问该站点。很可能是 mod_security 规则。 mod_security 可能甚至通过您的用户代理接收自动请求并开始阻止它或使用 406 拒绝它。

关于php - 使用 Guzzle 但不是通过浏览器或命令行 cURL 或 wget 时出现 406,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37958989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com