Php Gravatar上的get_headers()返回200而不是404

Php Gravatar上的get_headers()返回200而不是404,php,http-headers,get-headers,Php,Http Headers,Get Headers,我正在使用PHP的get_headers()传递一个URL,该URL将生成404错误。事实上,如果我使用URL作为链接,我的浏览器会出现404错误。如果我使用URL(指向图像文件)作为imgsrc,浏览器的“网络”选项卡将显示404错误状态。但是当我打印@get\u headers($uri)的结果时,我看到我的响应返回HTTP/1.0 200 OK!怎么回事 这是web服务器本身的问题吗?如果是这样,我应该与服务器支持人员沟通什么(如果有的话)来让他们解决问题 更新 我测试的URL是一个gra

我正在使用PHP的
get_headers()
传递一个URL,该URL将生成404错误。事实上,如果我使用URL作为链接,我的浏览器会出现404错误。如果我使用URL(指向图像文件)作为img
src
,浏览器的“网络”选项卡将显示404错误状态。但是当我
打印
@get\u headers($uri)
的结果时,我看到我的响应返回
HTTP/1.0 200 OK
!怎么回事

这是web服务器本身的问题吗?如果是这样,我应该与服务器支持人员沟通什么(如果有的话)来让他们解决问题

更新


我测试的URL是一个gravatar URL:

我做了一个测试,得到的是404而不是200

  $url = 'http://0.gravatar.com/avatar/4d445fd58bf07d406345bac336c3b836?s=96&d=404&r=G';
  var_dump(get_headers($url, 0));
  /* array (size=11)
  0 => string 'HTTP/1.0 404 Not Found' (length=22)
  1 => string 'Cache-Control: max-age=300' (length=26)
  2 => string 'Content-Type: text/html; charset=utf-8' (length=38)
  3 => string 'Date: Tue, 16 Apr 2013 13:46:12 GMT' (length=35)
  4 => string 'Expires: Tue, 16 Apr 2013 13:51:12 GMT' (length=38)
  5 => string 'Last-Modified: Fri, 28 Sep 2012 05:18:58 GMT' (length=44)
  6 => string 'Server: nginx' (length=13)
  7 => string 'Via: 1.1 varnish' (length=16)
  8 => string 'X-Varnish: 3241507148 3241041069' (length=32)
  9 => string 'Content-Length: 13' (length=18)
  10 => string 'Connection: close' (length=17)
  */
我做了一些搜索,似乎get_headers()的行为主要取决于PHP版本

但是,可以通过更改HTTP上下文选项来更改它(请参阅:)

编辑
这里有一个非常类似的问题:

发送到
get\u headers()
的URL有html转义实体,特别是
&而不是实际的
&
符号和标记这对
get_headers()。解决方案只是在构建URL时使用
&

检查重力仪有效性的具体应用

由于我在检查Gravatar的有效性时遇到了这种情况,并且我使用的代码或多或少是在一些“官方”文档中,因此我将发布这篇文章,以防其他人遇到同样的问题并希望得到剪切粘贴解决方案

$url = "$host/avatar/";
$url .= $email_hash;
$url .= '?s='.$size;
$url .= '&d=404';

$gravatar_response_code = wp_cache_get( $email_hash );
if ( false === $gravatar_response_code ){
    $response = wp_remote_head ( $url );
    if ( is_wp_error( $response ) ){
        $gravatar_response_code = "error";
    } else {
        $gravatar_response_code = $response['response']['code'];
    }

    wp_cache_set( $email_hash, $gravatar_response_code, '', 300 );
}

if ( '200' == $gravatar_response_code )
    $avatar = "<img alt='{$safe_alt}' src='{$url}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
$url=“$host/avatar/”;
$url.=$email\u散列;
$url.='?s='.$size;
$url.='&d=404';
$gravatar\u response\u code=wp\u cache\u get($email\u hash);
if(false==$gravatar\u响应\u代码){
$response=wp\u remote\u head($url);
如果(是错误($response)){
$gravatar\u response\u code=“error”;
}否则{
$gravatar_response_code=$response['response']['code'];
}
wp_cache_set($email_hash,$gravatar_response_code',,300);
}
如果('200'=$gravatar\u响应\u代码)
$avatar=“”;

请注意,某些函数
wp\u cache\u get()
wp\u remote\u head()
wp\u cache\u set()
是WordPress特有的函数。HTTP API的
wp\u remote\u head()
方法将调用
curl
get\u headers()
甚至
fopen()
,这取决于可用的内容,因此它是100%相关的,并表现出与此处所述内容相同的行为。

您的浏览器可能在get\u headers()时遵循重定向不是。@JRL在这种情况下,重定向将是3XX(例如302),而不是200。您能给我们URI吗?@MatRT它是一个gravatar URL,故意指向一个不存在的用户,并传递404默认参数。当您点击此链接时,您将在浏览器中看到404错误。感谢您的检查。我正在从本地XAMPP安装运行。我想知道这是否有关联?当然有,但是间接的。每个XAMPP、WAMP等都有一些PHP版本,最近有几个。检查XAMPP上的PHP版本,尝试检查我的答案中的链接。至少有两个设置可能会很有趣“follow_location”和“max_redirects”。感谢您的关注!我尝试按照链接SE问题中的建议设置
流\u上下文\u set\u default()
,但结果相同。我在摸索HTTP上下文选项时遇到了困难。您能发布您尝试过的内容(我指的是实际代码的一部分)吗?还有可能是你的PHP版本?好的,我已经采纳了你的建议,并在回答中公布了结果。