Php Gravatar上的get_headers()返回200而不是404
我正在使用PHP的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
get_headers()
传递一个URL,该URL将生成404错误。事实上,如果我使用URL作为链接,我的浏览器会出现404错误。如果我使用URL(指向图像文件)作为imgsrc
,浏览器的“网络”选项卡将显示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版本?好的,我已经采纳了你的建议,并在回答中公布了结果。