我对 HTTP、标头、浏览器、javascript、PHP 和所有这些相关的 hoo-hah 有相当多的经验,但这个让我很难过。
我使用 Dojo javascript 工具包编写了一个 Javascript RESTful 前端。它的一个组件是一个 RESTful 存储,它轮询后端的新数据项,将 If-Modified-Since 标头传递给服务器。然后后端响应自那时以来创建或更新的所有项目。我的后端是 PHP,它读取 $_SERVER['HTTP_IF_MODIFIED_SINCE'] 值,解析它,然后继续处理。
这在 Chrome 和 Firefox 中的本地主机(Ubuntu 13.05,apache2 2.4.6 PHP 5.5.3)上完美运行。但是,在我们的生产服务器(Centos 6.5 apache2 2.2.23 PHP 5.3.17)上,Chrome 工作正常,但 Firefox 有问题。
我看到的是 Firefox 正确发送 If-Modified-Since 标头并使用正常的日期格式,但是,PHP $_SERVER 变量包含 HTTP_IF_MODIFIED_SINCE 但该值似乎为空,并且 getallheaders() 返回一个没有该标头的数组,但是与所有其他标题。我的问题是,这可能是什么原因造成的,应该如何解决?
谷歌搜索这个主题让我发现很多人不知道如何使用 Last-Modified 使浏览器首先发送 If-Modified-Since ,或者如果发送了如何使用它。对于一种类型的浏览器,我找不到其他人存在发送但未在服务器上接收的问题。
我无法轻松地将 Firefox 网络监视器中的标题捕获为文本(做得很好 Mozilla),但相信我,If-Modified-Since 就在那里,其值例如Sat, 08 Feb 2014 10:29:14 GMT
位于 和Accept-Encoding
之间Content-Type
。
后端代码:
$l->log('test for header from user agent ' . $_SERVER['HTTP_USER_AGENT'] . '...');
$headers = getallheaders();
foreach ($headers as $name => $value) {
$l->log("Saw header $name => $value");
}
if (array_key_exists('HTTP_IF_MODIFIED_SINCE', $_SERVER)) {
$mod = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
$l->log('header exists: (' . $mod . ')');
// handle here
} else {
$l->log('No IF_MODIFIED_SINCE found.');
}
示例日志记录:
Feb 08 10:33:24 [info] test for header from user agent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0...
Feb 08 10:33:24 [info] Saw header Host => www.premierrange.co.uk
Feb 08 10:33:24 [info] Saw header User-Agent => Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0
Feb 08 10:33:24 [info] Saw header Accept => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Feb 08 10:33:24 [info] Saw header Accept-Language => en-US,en;q=0.5
Feb 08 10:33:24 [info] Saw header Accept-Encoding => gzip, deflate
Feb 08 10:33:24 [info] Saw header Content-Type => application/x-www-form-urlencoded
Feb 08 10:33:24 [info] Saw header X-Requested-With => XMLHttpRequest
Feb 08 10:33:24 [info] Saw header Referer => http://www.premierrange.co.uk/obfuscated
Feb 08 10:33:24 [info] Saw header Cookie => obfuscated
Feb 08 10:33:24 [info] Saw header Connection => keep-alive
Feb 08 10:33:24 [info] Saw header Via => HTTP/1.1 NetScaler, HTTP/1.1 NetScaler
Feb 08 10:33:24 [info] header exists: ()
Feb 08 10:33:24 [info] HTTP_IF_MODIFIED_SINCE strtotime gives turning that into date string gives 1970-01-01 01:00:00
如您所见,array_key_exists
测试返回 true,但值为空,但getallheaders()
似乎返回了一个不包含If-Modified-Since
.
任何线索,在我撕掉更多的头发之前?