如何在不使用服务器端缓存的情况下调用 cURL?

有没有办法告诉 cURL 命令不要使用服务器端缓存? 我有这个 curl 命令:

curl -v www.example.com

如何让 curl 发送不使用缓存的新请求?

注意 : 我正在终端中寻找一个可执行命令。

133289 次浏览

我知道这是一个老问题,但是我想用同样的问题来回答用户:

curl -H 'Cache-Control: no-cache' http://www.example.com

This curl command servers in its header request to return non-cached data from the web server.

-H 'Cache-Control: no-cache'参数不能保证正常工作,因为远程服务器或其中的任何代理层都可以忽略它。如果它不起作用,您可以通过添加一个惟一的 querystring 参数来使用传统的方法。通常,服务器/代理会认为这是一个唯一的 URL 而不使用缓存。

curl "http://www.example.com?foo123"

但是,每次都必须使用不同的查询字符串值。否则,服务器/代理将再次匹配缓存。要每次自动生成不同的 query 字符串参数,可以使用 date +%s,它将返回自纪元以来的秒数。

curl "http://www.example.com?$(date +%s)"

-H 'Pragma: no-cache'-H 'Cache-Control: no-cache'都没有帮到我。在“ cmd + shift + r”(完全重载)的浏览器中,我在终端中看到了一个比 curl输出更新的版本。

如何自己调试

为了得到完全相同的结果,我进入浏览器 > F12(开发工具) > 网络/请求 > 右键单击请求 > “ Copy as cURL”,然后得到浏览器调用的 等效的 cURL命令。

然后,我把它粘贴到终端中,并开始一个接一个地删除参数,直到我发现令人惊讶的是,--compressed在我的案例中起到了作用。(呼叫 CloudFront AWS)

我的问题是我应该在查询字符串中使用单引号。

My code

if (event.queryStringParameters && event.queryStringParameters['Name']) {
responseMessage = 'Hello, ' + event.queryStringParameters['Name'] + '!';
}

我的要求

curl https://cssrq1srud.execute-api.us-east-1.amazonaws.com/serverless_lambda_stage/hello?Name=Terraform

returns zsh: no matches found

curl 'https://cssrq1srud.execute-api.us-east-1.amazonaws.com/serverless_lambda_stage/hello?Name=Terraform'

返回 {"message":"Hello, Terraform!"}

这对我不起作用:

curl -H 'Cache-Control: no-cache' http://www.example.com

但这个最终奏效了:

curl -H 'Cache-Control: no-cache' http://www.example.com&someFakeParam=$RANDOM

& some FakeParam = $RANDOM使 URL 每次都是唯一的,并绕过缓存。

您可以尝试以下方法在 curl时强制不保留 Cache。

注意: 服务器可能被配置为尊重 Cache-Control报头,也可能不被配置为尊重 Cache-Control报头。因此,这种方法是否有效取决于我们发送 HTTP请求的服务器或网站。

带有 Cache-Control 标头的 curl 命令

$ curl -H 'Cache-Control: no-cache, no-store' http://www.example.com

Adding the Pragma HTTP Header

$ curl -H 'Pragma: no-cache' http://www.example.com

最后,最常用的方法是: 通过更改 URL 来绕过缓存

curl -H 'Cache-Control: no-cache, no-store' http://www.example.com?$(date +%s)