Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何测试;如果修改自";HTTP头支持_Php_Http_Curl_Http Headers - Fatal编程技术网

Php 如何测试;如果修改自";HTTP头支持

Php 如何测试;如果修改自";HTTP头支持,php,http,curl,http-headers,Php,Http,Curl,Http Headers,使用PHP,我如何准确地测试远程网站是否支持If Modified-Since”HTTP头 据我所知,如果您得到的远程文件在头请求中指定的日期之后被修改,那么它应该返回200 OK状态。如果尚未修改,则应返回一个“未修改” 因此,我的问题是,如果服务器不支持“if Modified Since”,但仍然返回200 OK怎么办 有一些工具可以检查你的网站是否支持“if Modified Since”,所以我想我是在问它们是如何工作的 编辑: 我已经使用Curl执行了一些测试,发送了以下内容: cu

使用PHP,我如何准确地测试远程网站是否支持If Modified-Since”HTTP头

据我所知,如果您得到的远程文件在头请求中指定的日期之后被修改,那么它应该返回200 OK状态。如果尚未修改,则应返回一个“未修改”

因此,我的问题是,如果服务器不支持“if Modified Since”,但仍然返回200 OK怎么办

有一些工具可以检查你的网站是否支持“if Modified Since”,所以我想我是在问它们是如何工作的

编辑:


我已经使用Curl执行了一些测试,发送了以下内容:

curl_setopt($ch, CURLOPT_HTTPHEADER, array("If-Modified-Since: ".gmdate('D, d M Y H:i:s \G\M\T',time()+60*60*60*60)));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_FORBID_REUSE, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4);
curl_setopt($ch, CURLOPT_TIMEOUT, 4);
i、 e.google.com未来返回的日期

HTTP/1.0 304 Not Modified
Date: Fri, 05 Feb 2010 16:11:54 GMT
Server: gws
X-XSS-Protection: 0
X-Cache: MISS from .
Via: 1.0 .:80 (squid)
Connection: close
HTTP/1.0 200 OK
Date: Fri, 05 Feb 2010 16:09:12 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Server: gws
X-XSS-Protection: 0
X-Cache: MISS from .
Via: 1.0 .:80 (squid)
Connection: close
如果我发送

curl_setopt($ch, CURLOPT_HTTPHEADER, array("If-Modified-Since: ".gmdate('D, d M Y H:i:s \G\M\T',time()-60*60*60*60)));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_FORBID_REUSE, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4);
curl_setopt($ch, CURLOPT_TIMEOUT, 4);
i、 e.google.com返回过去的日期

HTTP/1.0 304 Not Modified
Date: Fri, 05 Feb 2010 16:11:54 GMT
Server: gws
X-XSS-Protection: 0
X-Cache: MISS from .
Via: 1.0 .:80 (squid)
Connection: close
HTTP/1.0 200 OK
Date: Fri, 05 Feb 2010 16:09:12 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Server: gws
X-XSS-Protection: 0
X-Cache: MISS from .
Via: 1.0 .:80 (squid)
Connection: close
如果我将两者都发送到bbc.co.uk(它不支持)

未来的回归

HTTP/1.1 200 OK
Date: Fri, 05 Feb 2010 16:12:51 GMT
Server: Apache
Set-Cookie: BBC-UID=84bb66bc648318e367bdca3ad1d48cf627005b54f090f211a2182074b4ed92c40ForbSoft%20Web%20Diagnostics%20%28URL%20Validator%29; expires=Tue, 04-Feb-14 16:12:51 GMT; path=/; domain=bbc.co.uk;
Accept-Ranges: bytes
Cache-Control: max-age=0
Expires: Fri, 05 Feb 2010 16:12:51 GMT
Pragma: no-cache
Content-Length: 111677
Content-Type: text/html
过去申报的日期

HTTP/1.1 200 OK
Date: Fri, 05 Feb 2010 16:14:01 GMT
Server: Apache
Set-Cookie: BBC-UID=841b66ec44232cd91e81e88a014a3c5e50ed4e20c0e07174c4ff59675cd2fa210ForbSoft%20Web%20Diagnostics%20%28URL%20Validator%29; expires=Tue, 04-Feb-14 16:14:01 GMT; path=/; domain=bbc.co.uk;
Accept-Ranges: bytes
Cache-Control: max-age=0
Expires: Fri, 05 Feb 2010 16:14:01 GMT
Pragma: no-cache
Content-Length: 111672
Content-Type: text/html
所以我的问题仍然有效。

如果实体返回“上次修改”的标题,那么它支持该标题。这很有道理

更多信息:(有条件请求的简要指南)

显然,只有静态页面/文件才会有该标题。对于动态内容(asp、php等),无法通过标题来了解(除非站点处理程序手动缓存,例如),根据我的经验,如果修改,实体可能支持,也可能不支持

也许您可以只做两个请求,一个接一个,发送一个If-Modified-Since头,然后验证第二个请求是304还是200


编辑-hurikhan77指出了一个重要的注意事项,例如,测试站点的根目录以获取此功能,并不保证站点的其余部分也支持/不支持此功能。

我已经对此进行了一些测试,其工作原理如下

如果发送日期为过去的If Modified-Since标头(当前时间前5分钟应发送),则google.com、w3.org、mattcutts.com等网站将返回“HTTP/1.1 304未修改”标头。yahoo.com、bbc.co.uk和stackoverflow.com等网站总是返回“HTTP/1.1200 OK”

“Last Modified”头与“If Modified Since”没有任何关系,因为发回“HTTP/1.1 304 Not Modified”头的全部意义在于您不必发送正文(从而节省带宽——这就是本文背后的全部意义)

因此,我的问题的答案是,如果一个站点在发送“if Modified Since 5 mins ago”标头时没有返回“HTTP/1.1 304 Not Modified”标头,那么该站点就不会正确支持“if Modified Since”请求

如果我是不正确的,请这样说,并提供测试来证明


编辑:我忘了补充一点,一个好的测试是向域(例如w3.org)发出一个正常的HEAD请求,抓取“上次修改”日期,然后发出另一个带有“If Modified Since:”的请求。这将测试“Last Modified”值和“If Modified Since”请求是否都受支持。请注意:服务器发回“上次修改”日期并不意味着它支持“如果修改,因为”

关于上面的第一个答案,我想指出,条件请求对动态内容的意义与对静态内容的意义相同。如果生成动态内容的代码知道后端实体(例如数据库项)没有更改,则应在有条件请求时发送304


Jan

是的,这是有道理的,非常感谢你给我发送链接这不完全是真的:用“实体”替换“服务器”,它会合适的。请发布你正在使用的curl命令,我正在测试命令行,我得到的是200s,不管我发送的是什么头。如果服务器不支持If-Modified-Since,但仍然返回200状态码,那么它就像您在没有If-Modified-Since的情况下发送请求一样,并且服务器以200状态码响应。没有区别。200是200,“请求已成功”。@Infinity-我在上面的原始帖子中添加了curl命令/选项。问题本身是错误的,因为请求的位置/实体必须支持此标题,而不是网站或服务器(正如@Infinity所指出的)。因此,测试一个URL并不能告诉您服务器的其他可请求实体。我很高兴您找到了一个解决方案,但我在回答中提到,相对于更“理论”的头方法,这是一种更“实用”的推断服务器能力的方法。引用我自己的话:“也许你可以做两个请求,一个接一个,发送一个If-Modified-Since头,然后验证第二个请求是304还是200。”@Infinity-如果你读了我的答案,你会看到你的请求是另一棵树,但我明白你所说的“实用”方法的意思,首先,每个浏览器处理这个概念的方式都不同。其次,使用ChromeV22,服务器必须为Chrome发送“LastModified”报头,以发送后续的“IfModified-Since”报头。这个答案是不正确的。