不使用缓存的cURL命令
1. 概述
cURL 是一种广泛使用的 Linux 工具,用于发送 HTTP 请求和查看响应。在某些情况下,我们可能需要发送避免缓存的请求并每次都从服务器生成新的响应。在深入研究之前,我们需要了解缓存可以发生在客户端(浏览器缓存)或服务器端(应用程序级缓存或代理层缓存,如 Apache 或 NGINX)。
当我们使用 cURL 命令时,一定要注意 cURL 只是一个 HTTP 客户端,它不会在客户端缓存任何请求。因此,使用此命令时的任何缓存都发生在服务器端。为了绕过服务器端缓存,我们可以尝试对我们发送的 HTTP 请求进行一些调整。但是,这些可能会或可能不会工作,具体取决于服务器配置为进行缓存的方式。我们将在下面讨论这些调整。
2. 添加Cache-Control HTTP Header
我们可以在 HTTP 请求和响应中使用Cache-Control HTTP 标头来控制缓存行为。我们需要在此标头下提供指令,我们可能感兴趣的一些指令是:
- no-cache:这应该会导致在发回响应之前使用原始资源重新验证缓存。
- no-store:根本不应该缓存此请求的响应。
我们可以使用带有Cache-Control标头的curl命令并包含我们想要的指令:
$ curl -H 'Cache-Control: no-cache, no-store' http://www.example.com
服务器可能会或可能不会配置为尊重Cache-Control标头。因此,此方法是否有效取决于我们将 HTTP 请求发送到的服务器或网站。
3. 添加Pragma HTTP 标头
我们上面讨论的Cache-Control HTTP 标头仅在 HTTP 1.1 中引入。为了向后兼容仍然使用 HTTP 1.0 的系统,我们可以使用Pragma标头:
$ curl -H 'Pragma: no-cache' http://www.example.com
与之前的方法一样,服务器可能会或可能不会考虑使用此指令来处理新请求,但值得一试。
4. 老派方式:更改 URL
大多数服务器端缓存(尤其是在代理层设置的缓存)通过缓存针对用于访问它的 URL 生成的响应来工作。因此,我们可以通过更改 URL以不影响我们的响应的方式绕过缓存。
最常见的方法是添加一个查询参数或查询字符串,我们确信它不会以任何方式改变预期的响应。首先,我们可以在 URL 中添加一个字符串作为查询参数:
$ curl http://www.example.com/?xyzzyspoon
虽然这在我们第一次尝试将字符串附加到 URL 时有效,但这个新 URL 也将被缓存并停止在后续请求中为我们提供新的响应。我们可以编写一个每次生成不同 URL 的命令来克服这个问题。
一种方法是使用$RANDOM shell 变量**,每次访问它时都会返回一个随机整数:
$ curl "http://www.example.com/?$RANDOM"
**每次发送请求时更改 URL 的另一种相当简单的方法是使用时间戳作为查询参数。**为此,我们可以使用date 命令:
$ curl "http://www.example.com/?$(date +%s)"