如何使 HTTP 缓存标头发挥作用

如何使 HTTP 缓存标头发挥作用

有人能帮我解决 HTTP 缓存问题吗?

我认为,如果我设置了“Expires”和“Cache-Control:max-age”请求标头,那么浏览器直到 max-age 过去之后才会发出 GET 请求?

我的服务器看到很多条件 GET 请求,并且它以 304 回复。但是,如果可能的话,我想消除这些条件 GET,并让浏览器仅在认为资源已过期时才请求资源。

以下是我从 Chrome 的开发者工具中获得的详细信息:

Request URL:http://localhost:8080/img/branding.gif
Request Method:GET
Status Code:304 Not Modified

请求标头:

Cache-Control:max-age=0
If-Modified-Since:Thu, 22 Jul 2010 10:54:34 GMT
Referer:http://localhost:8080/
User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4

响应标头:

Cache-Control:max-age=2246400, s-maxage=0
Connection:Keep-Alive
Content-Location:/img/branding.gif
Content-Type:image/gif
Date:Fri, 23 Jul 2010 15:06:10 GMT
Expires:Fri, 07 Jan 2011 15:06:10 GMT
Keep-Alive:timeout=15, max=100
Last-Modified:Thu, 22 Jul 2010 10:54:34 GMT
Pragma:cache
Server:Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)

我在 Java 代码中的过滤器中设置了缓存标头。该代码在 Oracle 的 OC4J 上运行。

另外,我想通过 HTTPS 运行它。使用相同的标头是否也适用于 HTTPS?

提前致谢。

答案1

如果删除 Last-Modified 和 ETag 标头,您将完全消除 If-Modified-Since 和 If-None-Match 请求及其 304 Not Modified 响应,因此文件将保持缓存状态而无需检查更新,直到 Expires 标头指示有新内容可用。

来源:http://www.askapache.com/htaccess/apache-speed-last-modified.html

答案2

我认为,如果我设置了“Expires”和“Cache-Control:max-age”请求标头,那么浏览器直到 max-age 过去之后才会发出 GET 请求?

问题是发生了什么max-age 已过期。然后,您将陷入一个恶性循环,浏览器每次看到对内容的引用时都会请求内容 - 并且每次 Web 服务器都会以 304 not modified 响应。有些浏览器甚至会在每次文件出现在同一个页面上时询问!请求所花费的大部分时间用于 TCP 握手的往返,然后是 HTTP 标头 - 因此这通常会导致页面速度更慢,因为您(几乎)提供了缓存详细信息。通过 SSL 的效果甚至更糟,因为这会导致至少一次额外的往返服务器。

规范中的退出条款是,网络服务器可以通过向原始文件提供新的缓存指令来响应条件请求 - 但在实践中这可能很难做到。

如果是 apache 2.0 或更高版本,那么您可以通过使用 mod_headers 删除请求的条件部分(删除请求标头中的 if-modified-since 和 if-none-match 行)来解决问题。对于 1.3 或更早版本,您可以通过一个 cron 作业来解决此问题,该作业每 N 天(其中 N 略小于您的默认缓存时间)接触文件一次。

另外,我想通过 HTTPS 运行它。使用相同的标头是否也适用于 HTTPS?

我猜你展示的例子是非 SSL 的。是的,这种方法适用于非 SSL,但一定要注意浏览器的 keep-alive(非 Microsoft Web 服务器在尝试使用 Keep-alive 进行 SSL 连接通信时会陷入困境,但它确实可以大大提高性能)。

C。

相关内容