Apache不服从If-Modified-Since

时间:2014-01-04 22:04:01

标签: java apache http-headers cache-control apache-httpcomponents

我正在下载一个JAR文件,并希望利用If-Modified-Since所以如果我不需要它,我就不会得到整个文件,但出于某种原因,我的香草Apache(afaik)不是' t正确返回304。

这是来自wireshark:

GET /whatever.jar HTTP/1.1
If-Modified-Since: Sat, 04 Jan 2014 21:46:26 GMT
User-Agent: Jakarta Commons-HttpClient/3.1
Host: example.com

HTTP/1.1 200 OK
Date: Sat, 04 Jan 2014 20:32:31 GMT
Server: Apache/2.2.4 (Unix) mod_ssl/2.2.4 OpenSSL/0.9.8e DAV/2 mod_jk/1.2.26 PHP/5.3.6 SVN/1.4.4
Last-Modified: Sat, 04 Jan 2014 19:13:14 GMT
ETag: "b6c037-1ddad9f-d17a6680"
Accept-Ranges: bytes
Content-Length: 31305119
Vary: User-Agent
Content-Type: text/plain

... [bunch of bytes] ...

我需要指定其他标题,是吗?我错过了Apache需要的模块才能正确读取此标题吗?

还有其他想法或建议吗?

这是我的Java代码,供参考:

    File jarFile = new File(filePath);
    GetMethod get = new GetMethod(downloadUrl);

    Date lastModified = new Date(jarFile.lastModified());
    get.setRequestHeader("If-Modified-Since", DateUtil.formatDate(lastModified));

    HttpClient client = new HttpClient();
    int code = client.executeMethod(get);

更新:解决方案

If-Modified-Date需要与服务器完全匹配,我通过在下载的文件中明确设置lastModifiedDate来实现此目的:

String serverModified = get.getResponseHeader("Last-Modified").getValue();
jarFile.setLastModified(DateUtil.parseDate(serverModified).getTime());

执行此操作后,后续调用将不会下载该文件。

1 个答案:

答案 0 :(得分:3)

要使用“If-Modified-Since”标头,您必须发送与“Last-Modified”标头相同的标头值,即Sat, 04 Jan 2014 19:13:14 GMT!= Sat, 04 Jan 2014 21:46:26 GMT。 Apache无法保证文件未被修改并且故意给出过去的时间(可能通过版本控制回滚)。

如果需要,您可以使用HeadMethod 第一个检查客户端的“上次修改”标题,以避免“获取”资源(如果没有)被修改了。然后,如果已经被修改,你将使用“GetMethod”。

有关详情,请参阅RFC2616 - Section 9,“HTTP / 1.1:方法定义”。