【问题标题】:Apache not obeying If-Modified-SinceApache 不遵守 If-Modified-Since
【发布时间】:2014-01-04 22:04:00
【问题描述】:

我正在下载一个 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());

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

【问题讨论】:

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


    【解决方案1】:

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

    如果需要,您可以检查客户端的“Last-Modified”标头,使用 HeadMethod first 来避免“获取”尚未修改的资源.如果 被修改了,那么您将使用“GetMethod”。

    请参阅RFC2616 - Section 9,“HTTP/1.1:方法定义”了解更多信息。

    【讨论】:

    • 好吧,听起来它会起作用,但它不应该在 GET 方法上返回 304 吗?或者也许我读错了规范。我认为您应该能够通过单个请求进行这种检查。
    • @SeanAdkinson 向“Last-Modified”发送相同的“If-Modified-Since”标头,即Sat, 04 Jan 2014 19:13:14 GMT != Sat, 04 Jan 2014 21:46:26 GMT
    • 好的,我明白你在说什么。我认为服务器会使用小于或大于来比较日期,而不是严格相等。一旦我发送了完全相同的日期字符串,我就得到了想要的结果。
    • 你能更新你的答案来说出你的评论吗?那我给你答案,因为当前的答案不太适合我。
    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 2012-11-01
    • 2011-10-03
    • 2023-03-31
    • 2020-12-27
    • 2018-10-23
    • 2016-12-10
    • 2016-04-02
    相关资源
    最近更新 更多