mirror of
https://github.com/nextcloud/server.git
synced 2026-04-22 23:03:00 -04:00
Improve caching policy
* Cache css with version in url. This makes most js and css requests to be cached by the browser * Force caching previews, the etag is in the url so that if the propfind gives a new etag, we will refresh it otherwise it's no use to try to fetch the new etag and do tons of DB queries Tested with firefox and 'debug' => false (important so that the js/css urls are generated with ?v= parameter) Signed-off-by: Carl Schwan <carl@carlschwan.eu>
This commit is contained in:
parent
cbc1cc78d1
commit
f6d0bb419e
5 changed files with 12 additions and 6 deletions
|
|
@ -47,6 +47,10 @@
|
|||
Header set Cache-Control "max-age=15778463"
|
||||
</FilesMatch>
|
||||
|
||||
<FilesMatch "\.(css|js|svg|gif|png|jpg|ico|wasm|tflite)(\?v=.*)?$">
|
||||
Header set Cache-Control "max-age=15778463, immutable"
|
||||
</FilesMatch>
|
||||
|
||||
# Let browsers cache WOFF files for a week
|
||||
<FilesMatch "\.woff2?$">
|
||||
Header set Cache-Control "max-age=604800"
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ class IconController extends Controller {
|
|||
}
|
||||
if ($iconFile !== false) {
|
||||
$response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/svg+xml']);
|
||||
$response->cacheFor(86400);
|
||||
$response->cacheFor(86400, false, true);
|
||||
return $response;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ class IconControllerTest extends TestCase {
|
|||
->with('icon-core-filetypes_folder.svg')
|
||||
->willReturn($file);
|
||||
$expected = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'image/svg+xml']);
|
||||
$expected->cacheFor(86400);
|
||||
$expected->cacheFor(86400, false, true);
|
||||
$this->assertEquals($expected, $this->iconController->getThemedIcon('core', 'filetypes/folder.svg'));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -167,8 +167,10 @@ class PreviewController extends Controller {
|
|||
|
||||
try {
|
||||
$f = $this->preview->getPreview($node, $x, $y, !$a, $mode);
|
||||
$response = new FileDisplayResponse($f, Http::STATUS_OK, ['Content-Type' => $f->getMimeType()]);
|
||||
$response->cacheFor(3600 * 24);
|
||||
$response = new FileDisplayResponse($f, Http::STATUS_OK, [
|
||||
'Content-Type' => $f->getMimeType(),
|
||||
]);
|
||||
$response->cacheFor(3600 * 24, false, true);
|
||||
return $response;
|
||||
} catch (NotFoundException $e) {
|
||||
return new DataResponse([], Http::STATUS_NOT_FOUND);
|
||||
|
|
|
|||
|
|
@ -103,10 +103,10 @@ class Response {
|
|||
* @return $this
|
||||
* @since 6.0.0 - return value was added in 7.0.0
|
||||
*/
|
||||
public function cacheFor(int $cacheSeconds, bool $public = false) {
|
||||
public function cacheFor(int $cacheSeconds, bool $public = false, bool $immutable = false) {
|
||||
if ($cacheSeconds > 0) {
|
||||
$pragma = $public ? 'public' : 'private';
|
||||
$this->addHeader('Cache-Control', $pragma . ', max-age=' . $cacheSeconds . ', must-revalidate');
|
||||
$this->addHeader('Cache-Control', sprintf('%s, max-age=%s, %s', $pragma, $cacheSeconds, ($immutable ? 'immutable' : 'must-revalidate')));
|
||||
$this->addHeader('Pragma', $pragma);
|
||||
|
||||
// Set expires header
|
||||
|
|
|
|||
Loading…
Reference in a new issue