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

时间:2013-04-15 21:25:53

标签: php http-headers get-headers

我正在使用PHP的get_headers()传递一个应该生成404错误的URL。事实上,如果我使用URL作为链接,我的浏览器会出现404错误。如果我使用URL(作为图像文件)作为img src,浏览器的“网络”标签会显示404错误状态。但当我print_r @get_headers( $uri )的结果时,我发现我的回复会返回HTTP/1.0 200 OK!怎么了?

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

更新

我正在测试的网址是一个重力网址:http://0.gravatar.com/avatar/4d445fd58bf07d406345bac336c3b836?s=96&d=404&r=G

2 个答案:

答案 0 :(得分:1)

我做了一个测试,我得到了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上下文选项来更改它(请参阅:HTTP context options

修改

这是一个非常类似的问题:PHP get_headers() reports different headers than CURL

答案 1 :(得分:0)

发送给get_headers()的网址包含html转义实体,特别是&amp;而不是实际的&&符号。 这会对get_headers() 产生影响,但最初使用(<img src='{$url}'... />)并不介意html实体编码版本。解决方案只是在构建URL时使用&

检查Gravatar有效性的具体申请

因为我在检查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}' />";

请注意,某些功能wp_cache_get()wp_remote_head()wp_cache_set()是特定于WordPress的功能。 HTTP API的wp_remote_head()方法将调用curlget_headers()甚至fopen(),具体取决于可用内容,因此它具有100%的相关性,并展示与此处记录的行为相同的行为。