I'm working currently on REST API. I wanted to check if HTTP cache is working fine, but unfortunatelly I doesn't work at all. No matter what I do, it always return HTTP code 200 while it should return 304 from what I know.
Here is my PHP code:
public function getList()
{
$this->addHeaders(array(
'Cache-Control' => 'public, must-revalidate, max-age=120',
'eTag' => 'xyz123',
));
$array = array(
'foo' => 'bar',
'nested' => array(
'lorem' => 'ipsum',
'dolor' => 'sit amet'
)
);
$this->addHeader('Content-Length', strlen(json_encode($array, true)));
return new JsonModel($array);
}
Response/Request
ETag doesn't change, so requests except first one should be served from cache. Am I wrong?
I was following these 2 articles:
I also checked with weak validator- Last-Modified but I got same problem. Browser sends correct header in Request, but I still get 200 in response
ETag requires the server to send a 304 response back in order to trigger loading from the Cache.
In a time based cache:
In an ETag based cache:
To make your code work, you need to check for the presence of the If-None-Match
header in the PHP:
If(isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == 'xyz123') {
header("HTTP/1.1 304 Not Modified");
exit();
}
Your client is sending the Cache-Control
header with a value of max-age=0
. This indicates to the server that the client requests a fresh response and the server sends an HTTP 200 status code.
The Cache-Control
header sent by the client is usually the result of using the developer tools in the browser and not disabling the "Disable caching" option.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With