2

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

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

更新

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

4

2 回答 2

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 上下文选项

编辑

这是一个非常相似的问题:PHP get_headers() 报告的标题与 CURL 不同

于 2013-04-16T13:58:28.340 回答
0

被发送到的 URLget_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()是WordPress 特定的功能。HTTP API的方法将调用,甚至取决于可用的方法,因此它是 100% 相关的,并且表现出与此处记录的相同的行为。wp_remote_head()wp_cache_set()wp_remote_head()curlget_headers()fopen()

于 2013-04-17T13:53:46.250 回答