我正在使用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
答案 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转义实体,特别是&
而不是实际的&
&符号。 这会对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()
方法将调用curl
,get_headers()
甚至fopen()
,具体取决于可用内容,因此它具有100%的相关性,并展示与此处记录的行为相同的行为。