gpt4 book ai didi

PHP - `get_headers` 返回有效 URL 的 "400 Bad Request"和 "403 Forbidden"?

转载 作者:可可西里 更新时间:2023-11-01 14:00:43 27 4
gpt4 key购买 nike

描述底部的工作解决方案!

我正在运行 PHP 5.4,并试图获取 URL 列表的 header 。

在大多数情况下,一切正常,但有三个 URL 导致了问题(并且可能更多,需要进行更广泛的测试)。

'http://www.alealimay.com'
'http://www.thelovelist.net'
'http://www.bleedingcool.com'

这三个站点在浏览器中都可以正常工作,并产生以下 header 响应:

(来自 Safari)

successful headers

请注意,所有三个 header 响应都是 Code = 200

但通过 PHP 检索 header ,使用 get_headers ...

stream_context_set_default(array('http' => array('method' => "HEAD")));
$headers = get_headers($url, 1);
stream_context_set_default(array('http' => array('method' => "GET")));

...返回以下内容:

url  ......  "http://www.alealimay.com"

headers
| 0 ............................ "HTTP/1.0 400 Bad Request"
| content-length ............... "378"
| X-Synthetic .................. "true"
| expires ...................... "Thu, 01 Jan 1970 00:00:00 UTC"
| pragma ....................... "no-cache"
| cache-control ................ "no-cache, must-revalidate"
| content-type ................. "text/html; charset=UTF-8"
| connection ................... "close"
| date ......................... "Wed, 24 Aug 2016 01:26:21 UTC"
| X-ContextId .................. "QIFB0I8V/xsTFMREg"
| X-Via ........................ "1.0 echo109"



url ...... "http://www.thelovelist.net"

headers
| 0 ............................ "HTTP/1.0 400 Bad Request"
| content-length ............... "378"
| X-Synthetic .................. "true"
| expires ...................... "Thu, 01 Jan 1970 00:00:00 UTC"
| pragma ....................... "no-cache"
| cache-control ................ "no-cache, must-revalidate"
| content-type ................. "text/html; charset=UTF-8"
| connection ................... "close"
| date ......................... "Wed, 24 Aug 2016 01:26:22 UTC"
| X-ContextId .................. "aNKvf2RB/bIMjWyjW"
| X-Via ........................ "1.0 echo103"



url ...... "http://www.bleedingcool.com"

headers
| 0 ............................ "HTTP/1.1 403 Forbidden"
| Server ....................... "Sucuri/Cloudproxy"
| Date ......................... "Wed, 24 Aug 2016 01:26:22 GMT"
| Content-Type ................. "text/html"
| Content-Length ............... "5311"
| Connection ................... "close"
| Vary ......................... "Accept-Encoding"
| ETag ......................... "\"57b7f28e-14bf\""
| X-XSS-Protection ............. "1; mode=block"
| X-Frame-Options .............. "SAMEORIGIN"
| X-Content-Type-Options ....... "nosniff"
| X-Sucuri-ID .................. "11005"

不管改变stream_context都是这样

//stream_context_set_default(array('http' => array('method' => "HEAD")));
$headers = get_headers($url, 1);
//stream_context_set_default(array('http' => array('method' => "GET")));

产生相同的结果。

其中任何一个都不会引发警告或错误(通常使用 @get_headers 抑制错误,但两种方式都没有区别)。

我已经检查了我的php.ini,并且有allow_url_fopen设置为 On

我正前往 stream_get_meta_data , 并且我对 CURL 解决方案不感兴趣stream_get_meta_data(及其随附的 fopen)将在与 get_headers 相同的位置失败,因此在这种情况下修复一个将同时修复两个问题。

通常,如果有重定向,输出如下:

url  ......  "http://www.startingURL.com/"

headers
| 0 ............................ "HTTP/1.1 301 Moved Permanently"
| 1 ............................ "HTTP/1.1 200 OK"
| Date
| | "Wed, 24 Aug 2016 02:02:29 GMT"
| | "Wed, 24 Aug 2016 02:02:32 GMT"
|
| Server
| | "Apache"
| | "Apache"
|
| Location ..................... "http://finishingURL.com/"
| Connection
| | "close"
| | "close"
|
| Content-Type
| | "text/html; charset=UTF-8"
| | "text/html; charset=UTF-8"
|
| Link ......................... "; rel=\"https://api.w.org/\", ; rel=shortlink"

为什么这些网站在浏览器中工作,但在使用 get_headers 时却失败了?

有各种 SO 帖子讨论同一件事,但所有这些帖子的解决方案都不适用于这种情况:

POST requires Content-Length (我正在发送一个 HEAD 请求,没有返回任何内容)

URL contains UTF-8 data (这些网址中唯一的字符全部来自拉丁字母表)

Cannot send a URL with spaces in it (这些网址都是无空格的,各方面都很普通)

解决方案!

(感谢 Max 在下面的回答中为我指明了正确的轨道。)

问题是因为没有预定义的 user_agent,既没有在 php.ini 中设置,也没有在代码中声明。

因此,我更改了 user_agent 以模仿浏览器,执行操作,然后将其恢复为声明值(可能为空白)。

$OriginalUserAgent = ini_get('user_agent');
ini_set('user_agent', 'Mozilla/5.0');

$headers = @get_headers($url, 1);

ini_set('user_agent', $OriginalUserAgent);

发现用户代理更改 here .

最佳答案

发生这种情况是因为所有这三个站点都在检查请求的 UserAgent header 和响应,如果无法匹配,则会出现错误。 get_headers 函数不发送此 header 。您可以尝试使用 cURL 和此代码片段来获取网站内容:

$url = 'http://www.alealimay.com';
$c = curl_init($url);
curl_setopt($c, CURLOPT_USERAGENT, 'curl/7.48.0');
curl_exec($c);
var_dump(curl_getinfo($c));

更新:不必使用 cURL 来设置用户代理 header 。也可以使用 ini_set('user_agent', 'Mozilla/5.0'); 完成,然后 get_headers 函数将使用配置的值。

关于PHP - `get_headers` 返回有效 URL 的 "400 Bad Request"和 "403 Forbidden"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39113450/

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