Skip to content

[5.x] Fix static caching invalidation for multi-sites - #10669

Merged
jasonvarga merged 26 commits into
5.xfrom
fix/static-caching-invalidation-for-multisites
Apr 22, 2025
Merged

[5.x] Fix static caching invalidation for multi-sites#10669
jasonvarga merged 26 commits into
5.xfrom
fix/static-caching-invalidation-for-multisites

Conversation

@duncanmcclean

Copy link
Copy Markdown
Member

This pull request fixes some issues around Static Caching invalidation & Multi-sites, when the queue driver is set to anything other than sync.

When the DefaultInvalidator class passes down the invalidation rules from the config, it does so without specifying the domain in which the URLs should be invalidated.

$this->cacher->invalidateUrls(
Arr::get($this->rules, "collections.{$entry->collectionHandle()}.urls")
);

The invalidateUrls method attempts to get the domain from the invalidation URLs in the config (which is why the mentioned workaround works).

When an invalidation rule doesn't include a domain, it'll attempt to get the site's "base URL" using AbstractCacher::getBaseUrl():

publicfunctiongetBaseUrl()
{
// Check 'base_url' for backward compatibility.
if (! $baseUrl = $this->config('base_url')) {
// This could potentially just be Site::current()->absoluteUrl() but at the
// moment that method gets the URL based on the request. For now, we will
// manually get it from the config, as to not break any existing sites.
$baseUrl = Str::startsWith($url = Site::current()->url(), '/')
? Str::removeRight(config('app.url'), '/').$url
: $url;
}
returnrtrim($baseUrl, '/');
}

This method then calls Site::current() which gets the domain by getting the current site, based on the request URL.

However, since we're in the context of a queue, there is no request, so Statamic falls back to the "default" site URL, which causes the path on the intended site to not get invalidated (intended being the site the entry is associated with).

This pull request attempts to fix this by including the domain in the array of URLs passed to invalidateUrls.

Fixes#7691.
Replaces #10517.

@duncanmcclean
duncanmcclean marked this pull request as draft August 20, 2024 14:54
@duncanmcclean
duncanmcclean marked this pull request as ready for review August 27, 2024 14:58
@duncanmcclean

duncanmcclean commented Aug 27, 2024

Copy link
Copy Markdown
MemberAuthor

This is ready for review now.

The only thing I noticed while testing this PR on a real site was the fact that the GlobalVariablesSaved event is dispatched for every site whenever one site's globals are updated.

This means that whenever you update a global set, the global set will be invalidated in all sites, rather than just the site the global was just updated in.

I've opened a separate issue for that, as it'll likely require a breaking change in order to fix: #10888


Update: The above issue has been addressed in v6 (#11585).

@stuartcusackie

Copy link
Copy Markdown

Any chance of pushing this one through? I have a client who has had issues with static caching on their multisite for years now. Not sure if this PR will solve it but I am hopeful!

Comment threadsrc/StaticCaching/DefaultInvalidator.php Outdated
Comment threadsrc/StaticCaching/DefaultInvalidator.php Outdated
@wautersj

Copy link
Copy Markdown

Any idea on when this might be part of a V5 release?
I'm now facing this issue in 4 client sites.

In the meanwhile, a suggestion on a temp fix?

@jasonvarga
jasonvarga merged commit 7ab6702 into 5.xApr 22, 2025
@duncanmcclean
duncanmcclean deleted the fix/static-caching-invalidation-for-multisites branch April 22, 2025 13:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cache is not getting invalidated in Multisite setup

4 participants

@duncanmcclean@stuartcusackie@wautersj@jasonvarga
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
[5.x] Fix static caching invalidation for multi-sites by duncanmcclean · Pull Request #10669 · statamic/cms · GitHub
Skip to content

[5.x] Fix static caching invalidation for multi-sites - #10669

Merged
jasonvarga merged 26 commits into
5.xfrom
fix/static-caching-invalidation-for-multisites
Apr 22, 2025
Merged

[5.x] Fix static caching invalidation for multi-sites#10669
jasonvarga merged 26 commits into
5.xfrom
fix/static-caching-invalidation-for-multisites

Conversation

@duncanmcclean

Copy link
Copy Markdown
Member

This pull request fixes some issues around Static Caching invalidation & Multi-sites, when the queue driver is set to anything other than sync.

When the DefaultInvalidator class passes down the invalidation rules from the config, it does so without specifying the domain in which the URLs should be invalidated.

$this->cacher->invalidateUrls(
Arr::get($this->rules, "collections.{$entry->collectionHandle()}.urls")
);

The invalidateUrls method attempts to get the domain from the invalidation URLs in the config (which is why the mentioned workaround works).

When an invalidation rule doesn't include a domain, it'll attempt to get the site's "base URL" using AbstractCacher::getBaseUrl():

publicfunctiongetBaseUrl()
{
// Check 'base_url' for backward compatibility.
if (! $baseUrl = $this->config('base_url')) {
// This could potentially just be Site::current()->absoluteUrl() but at the
// moment that method gets the URL based on the request. For now, we will
// manually get it from the config, as to not break any existing sites.
$baseUrl = Str::startsWith($url = Site::current()->url(), '/')
? Str::removeRight(config('app.url'), '/').$url
: $url;
}
returnrtrim($baseUrl, '/');
}

This method then calls Site::current() which gets the domain by getting the current site, based on the request URL.

However, since we're in the context of a queue, there is no request, so Statamic falls back to the "default" site URL, which causes the path on the intended site to not get invalidated (intended being the site the entry is associated with).

This pull request attempts to fix this by including the domain in the array of URLs passed to invalidateUrls.

Fixes#7691.
Replaces #10517.

@duncanmcclean
duncanmcclean marked this pull request as draft August 20, 2024 14:54
@duncanmcclean
duncanmcclean marked this pull request as ready for review August 27, 2024 14:58
@duncanmcclean

duncanmcclean commented Aug 27, 2024

Copy link
Copy Markdown
MemberAuthor

This is ready for review now.

The only thing I noticed while testing this PR on a real site was the fact that the GlobalVariablesSaved event is dispatched for every site whenever one site's globals are updated.

This means that whenever you update a global set, the global set will be invalidated in all sites, rather than just the site the global was just updated in.

I've opened a separate issue for that, as it'll likely require a breaking change in order to fix: #10888


Update: The above issue has been addressed in v6 (#11585).

@stuartcusackie

Copy link
Copy Markdown

Any chance of pushing this one through? I have a client who has had issues with static caching on their multisite for years now. Not sure if this PR will solve it but I am hopeful!

Comment threadsrc/StaticCaching/DefaultInvalidator.php Outdated
Comment threadsrc/StaticCaching/DefaultInvalidator.php Outdated
@wautersj

Copy link
Copy Markdown

Any idea on when this might be part of a V5 release?
I'm now facing this issue in 4 client sites.

In the meanwhile, a suggestion on a temp fix?

@jasonvarga
jasonvarga merged commit 7ab6702 into 5.xApr 22, 2025
@duncanmcclean
duncanmcclean deleted the fix/static-caching-invalidation-for-multisites branch April 22, 2025 13:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cache is not getting invalidated in Multisite setup

4 participants

@duncanmcclean@stuartcusackie@wautersj@jasonvarga
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [5.x] Fix static caching invalidation for multi-sites by duncanmcclean · Pull Request #10669 · statamic/cms · GitHub
Skip to content

[5.x] Fix static caching invalidation for multi-sites - #10669

Merged
jasonvarga merged 26 commits into
5.xfrom
fix/static-caching-invalidation-for-multisites
Apr 22, 2025
Merged

[5.x] Fix static caching invalidation for multi-sites#10669
jasonvarga merged 26 commits into
5.xfrom
fix/static-caching-invalidation-for-multisites

Conversation

@duncanmcclean

Copy link
Copy Markdown
Member

This pull request fixes some issues around Static Caching invalidation & Multi-sites, when the queue driver is set to anything other than sync.

When the DefaultInvalidator class passes down the invalidation rules from the config, it does so without specifying the domain in which the URLs should be invalidated.

$this->cacher->invalidateUrls(
Arr::get($this->rules, "collections.{$entry->collectionHandle()}.urls")
);

The invalidateUrls method attempts to get the domain from the invalidation URLs in the config (which is why the mentioned workaround works).

When an invalidation rule doesn't include a domain, it'll attempt to get the site's "base URL" using AbstractCacher::getBaseUrl():

publicfunctiongetBaseUrl()
{
// Check 'base_url' for backward compatibility.
if (! $baseUrl = $this->config('base_url')) {
// This could potentially just be Site::current()->absoluteUrl() but at the
// moment that method gets the URL based on the request. For now, we will
// manually get it from the config, as to not break any existing sites.
$baseUrl = Str::startsWith($url = Site::current()->url(), '/')
? Str::removeRight(config('app.url'), '/').$url
: $url;
}
returnrtrim($baseUrl, '/');
}

This method then calls Site::current() which gets the domain by getting the current site, based on the request URL.

However, since we're in the context of a queue, there is no request, so Statamic falls back to the "default" site URL, which causes the path on the intended site to not get invalidated (intended being the site the entry is associated with).

This pull request attempts to fix this by including the domain in the array of URLs passed to invalidateUrls.

Fixes#7691.
Replaces #10517.

@duncanmcclean
duncanmcclean marked this pull request as draft August 20, 2024 14:54
@duncanmcclean
duncanmcclean marked this pull request as ready for review August 27, 2024 14:58
@duncanmcclean

duncanmcclean commented Aug 27, 2024

Copy link
Copy Markdown
MemberAuthor

This is ready for review now.

The only thing I noticed while testing this PR on a real site was the fact that the GlobalVariablesSaved event is dispatched for every site whenever one site's globals are updated.

This means that whenever you update a global set, the global set will be invalidated in all sites, rather than just the site the global was just updated in.

I've opened a separate issue for that, as it'll likely require a breaking change in order to fix: #10888


Update: The above issue has been addressed in v6 (#11585).

@stuartcusackie

Copy link
Copy Markdown

Any chance of pushing this one through? I have a client who has had issues with static caching on their multisite for years now. Not sure if this PR will solve it but I am hopeful!

Comment threadsrc/StaticCaching/DefaultInvalidator.php Outdated
Comment threadsrc/StaticCaching/DefaultInvalidator.php Outdated
@wautersj

Copy link
Copy Markdown

Any idea on when this might be part of a V5 release?
I'm now facing this issue in 4 client sites.

In the meanwhile, a suggestion on a temp fix?

@jasonvarga
jasonvarga merged commit 7ab6702 into 5.xApr 22, 2025
@duncanmcclean
duncanmcclean deleted the fix/static-caching-invalidation-for-multisites branch April 22, 2025 13:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cache is not getting invalidated in Multisite setup

4 participants

@duncanmcclean@stuartcusackie@wautersj@jasonvarga
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [5.x] Fix static caching invalidation for multi-sites by duncanmcclean · Pull Request #10669 · statamic/cms · GitHub
Skip to content

[5.x] Fix static caching invalidation for multi-sites - #10669

Merged
jasonvarga merged 26 commits into
5.xfrom
fix/static-caching-invalidation-for-multisites
Apr 22, 2025
Merged

[5.x] Fix static caching invalidation for multi-sites#10669
jasonvarga merged 26 commits into
5.xfrom
fix/static-caching-invalidation-for-multisites

Conversation

@duncanmcclean

Copy link
Copy Markdown
Member

This pull request fixes some issues around Static Caching invalidation & Multi-sites, when the queue driver is set to anything other than sync.

When the DefaultInvalidator class passes down the invalidation rules from the config, it does so without specifying the domain in which the URLs should be invalidated.

$this->cacher->invalidateUrls(
Arr::get($this->rules, "collections.{$entry->collectionHandle()}.urls")
);

The invalidateUrls method attempts to get the domain from the invalidation URLs in the config (which is why the mentioned workaround works).

When an invalidation rule doesn't include a domain, it'll attempt to get the site's "base URL" using AbstractCacher::getBaseUrl():

publicfunctiongetBaseUrl()
{
// Check 'base_url' for backward compatibility.
if (! $baseUrl = $this->config('base_url')) {
// This could potentially just be Site::current()->absoluteUrl() but at the
// moment that method gets the URL based on the request. For now, we will
// manually get it from the config, as to not break any existing sites.
$baseUrl = Str::startsWith($url = Site::current()->url(), '/')
? Str::removeRight(config('app.url'), '/').$url
: $url;
}
returnrtrim($baseUrl, '/');
}

This method then calls Site::current() which gets the domain by getting the current site, based on the request URL.

However, since we're in the context of a queue, there is no request, so Statamic falls back to the "default" site URL, which causes the path on the intended site to not get invalidated (intended being the site the entry is associated with).

This pull request attempts to fix this by including the domain in the array of URLs passed to invalidateUrls.

Fixes#7691.
Replaces #10517.

@duncanmcclean
duncanmcclean marked this pull request as draft August 20, 2024 14:54
@duncanmcclean
duncanmcclean marked this pull request as ready for review August 27, 2024 14:58
@duncanmcclean

duncanmcclean commented Aug 27, 2024

Copy link
Copy Markdown
MemberAuthor

This is ready for review now.

The only thing I noticed while testing this PR on a real site was the fact that the GlobalVariablesSaved event is dispatched for every site whenever one site's globals are updated.

This means that whenever you update a global set, the global set will be invalidated in all sites, rather than just the site the global was just updated in.

I've opened a separate issue for that, as it'll likely require a breaking change in order to fix: #10888


Update: The above issue has been addressed in v6 (#11585).

@stuartcusackie

Copy link
Copy Markdown

Any chance of pushing this one through? I have a client who has had issues with static caching on their multisite for years now. Not sure if this PR will solve it but I am hopeful!

Comment threadsrc/StaticCaching/DefaultInvalidator.php Outdated
Comment threadsrc/StaticCaching/DefaultInvalidator.php Outdated
@wautersj

Copy link
Copy Markdown

Any idea on when this might be part of a V5 release?
I'm now facing this issue in 4 client sites.

In the meanwhile, a suggestion on a temp fix?

@jasonvarga
jasonvarga merged commit 7ab6702 into 5.xApr 22, 2025
@duncanmcclean
duncanmcclean deleted the fix/static-caching-invalidation-for-multisites branch April 22, 2025 13:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cache is not getting invalidated in Multisite setup

4 participants

@duncanmcclean@stuartcusackie@wautersj@jasonvarga
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' [5.x] Fix static caching invalidation for multi-sites by duncanmcclean · Pull Request #10669 · statamic/cms · GitHub
Skip to content

[5.x] Fix static caching invalidation for multi-sites - #10669

Merged
jasonvarga merged 26 commits into
5.xfrom
fix/static-caching-invalidation-for-multisites
Apr 22, 2025
Merged

[5.x] Fix static caching invalidation for multi-sites#10669
jasonvarga merged 26 commits into
5.xfrom
fix/static-caching-invalidation-for-multisites

Conversation

@duncanmcclean

Copy link
Copy Markdown
Member

This pull request fixes some issues around Static Caching invalidation & Multi-sites, when the queue driver is set to anything other than sync.

When the DefaultInvalidator class passes down the invalidation rules from the config, it does so without specifying the domain in which the URLs should be invalidated.

$this->cacher->invalidateUrls(
Arr::get($this->rules, "collections.{$entry->collectionHandle()}.urls")
);

The invalidateUrls method attempts to get the domain from the invalidation URLs in the config (which is why the mentioned workaround works).

When an invalidation rule doesn't include a domain, it'll attempt to get the site's "base URL" using AbstractCacher::getBaseUrl():

publicfunctiongetBaseUrl()
{
// Check 'base_url' for backward compatibility.
if (! $baseUrl = $this->config('base_url')) {
// This could potentially just be Site::current()->absoluteUrl() but at the
// moment that method gets the URL based on the request. For now, we will
// manually get it from the config, as to not break any existing sites.
$baseUrl = Str::startsWith($url = Site::current()->url(), '/')
? Str::removeRight(config('app.url'), '/').$url
: $url;
}
returnrtrim($baseUrl, '/');
}

This method then calls Site::current() which gets the domain by getting the current site, based on the request URL.

However, since we're in the context of a queue, there is no request, so Statamic falls back to the "default" site URL, which causes the path on the intended site to not get invalidated (intended being the site the entry is associated with).

This pull request attempts to fix this by including the domain in the array of URLs passed to invalidateUrls.

Fixes#7691.
Replaces #10517.

@duncanmcclean
duncanmcclean marked this pull request as draft August 20, 2024 14:54
@duncanmcclean
duncanmcclean marked this pull request as ready for review August 27, 2024 14:58
@duncanmcclean

duncanmcclean commented Aug 27, 2024

Copy link
Copy Markdown
MemberAuthor

This is ready for review now.

The only thing I noticed while testing this PR on a real site was the fact that the GlobalVariablesSaved event is dispatched for every site whenever one site's globals are updated.

This means that whenever you update a global set, the global set will be invalidated in all sites, rather than just the site the global was just updated in.

I've opened a separate issue for that, as it'll likely require a breaking change in order to fix: #10888


Update: The above issue has been addressed in v6 (#11585).

@stuartcusackie

Copy link
Copy Markdown

Any chance of pushing this one through? I have a client who has had issues with static caching on their multisite for years now. Not sure if this PR will solve it but I am hopeful!

Comment threadsrc/StaticCaching/DefaultInvalidator.php Outdated
Comment threadsrc/StaticCaching/DefaultInvalidator.php Outdated
@wautersj

Copy link
Copy Markdown

Any idea on when this might be part of a V5 release?
I'm now facing this issue in 4 client sites.

In the meanwhile, a suggestion on a temp fix?

@jasonvarga
jasonvarga merged commit 7ab6702 into 5.xApr 22, 2025
@duncanmcclean
duncanmcclean deleted the fix/static-caching-invalidation-for-multisites branch April 22, 2025 13:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cache is not getting invalidated in Multisite setup

4 participants

@duncanmcclean@stuartcusackie@wautersj@jasonvarga
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [5.x] Fix static caching invalidation for multi-sites by duncanmcclean · Pull Request #10669 · statamic/cms · GitHub
Skip to content

[5.x] Fix static caching invalidation for multi-sites - #10669

Merged
jasonvarga merged 26 commits into
5.xfrom
fix/static-caching-invalidation-for-multisites
Apr 22, 2025
Merged

[5.x] Fix static caching invalidation for multi-sites#10669
jasonvarga merged 26 commits into
5.xfrom
fix/static-caching-invalidation-for-multisites

Conversation

@duncanmcclean

Copy link
Copy Markdown
Member

This pull request fixes some issues around Static Caching invalidation & Multi-sites, when the queue driver is set to anything other than sync.

When the DefaultInvalidator class passes down the invalidation rules from the config, it does so without specifying the domain in which the URLs should be invalidated.

$this->cacher->invalidateUrls(
Arr::get($this->rules, "collections.{$entry->collectionHandle()}.urls")
);

The invalidateUrls method attempts to get the domain from the invalidation URLs in the config (which is why the mentioned workaround works).

When an invalidation rule doesn't include a domain, it'll attempt to get the site's "base URL" using AbstractCacher::getBaseUrl():

publicfunctiongetBaseUrl()
{
// Check 'base_url' for backward compatibility.
if (! $baseUrl = $this->config('base_url')) {
// This could potentially just be Site::current()->absoluteUrl() but at the
// moment that method gets the URL based on the request. For now, we will
// manually get it from the config, as to not break any existing sites.
$baseUrl = Str::startsWith($url = Site::current()->url(), '/')
? Str::removeRight(config('app.url'), '/').$url
: $url;
}
returnrtrim($baseUrl, '/');
}

This method then calls Site::current() which gets the domain by getting the current site, based on the request URL.

However, since we're in the context of a queue, there is no request, so Statamic falls back to the "default" site URL, which causes the path on the intended site to not get invalidated (intended being the site the entry is associated with).

This pull request attempts to fix this by including the domain in the array of URLs passed to invalidateUrls.

Fixes#7691.
Replaces #10517.

@duncanmcclean
duncanmcclean marked this pull request as draft August 20, 2024 14:54
@duncanmcclean
duncanmcclean marked this pull request as ready for review August 27, 2024 14:58
@duncanmcclean

duncanmcclean commented Aug 27, 2024

Copy link
Copy Markdown
MemberAuthor

This is ready for review now.

The only thing I noticed while testing this PR on a real site was the fact that the GlobalVariablesSaved event is dispatched for every site whenever one site's globals are updated.

This means that whenever you update a global set, the global set will be invalidated in all sites, rather than just the site the global was just updated in.

I've opened a separate issue for that, as it'll likely require a breaking change in order to fix: #10888


Update: The above issue has been addressed in v6 (#11585).

@stuartcusackie

Copy link
Copy Markdown

Any chance of pushing this one through? I have a client who has had issues with static caching on their multisite for years now. Not sure if this PR will solve it but I am hopeful!

Comment threadsrc/StaticCaching/DefaultInvalidator.php Outdated
Comment threadsrc/StaticCaching/DefaultInvalidator.php Outdated
@wautersj

Copy link
Copy Markdown

Any idea on when this might be part of a V5 release?
I'm now facing this issue in 4 client sites.

In the meanwhile, a suggestion on a temp fix?

@jasonvarga
jasonvarga merged commit 7ab6702 into 5.xApr 22, 2025
@duncanmcclean
duncanmcclean deleted the fix/static-caching-invalidation-for-multisites branch April 22, 2025 13:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cache is not getting invalidated in Multisite setup

4 participants

@duncanmcclean@stuartcusackie@wautersj@jasonvarga
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [5.x] Fix static caching invalidation for multi-sites by duncanmcclean · Pull Request #10669 · statamic/cms · GitHub
Skip to content

[5.x] Fix static caching invalidation for multi-sites - #10669

Merged
jasonvarga merged 26 commits into
5.xfrom
fix/static-caching-invalidation-for-multisites
Apr 22, 2025
Merged

[5.x] Fix static caching invalidation for multi-sites#10669
jasonvarga merged 26 commits into
5.xfrom
fix/static-caching-invalidation-for-multisites

Conversation

@duncanmcclean

Copy link
Copy Markdown
Member

This pull request fixes some issues around Static Caching invalidation & Multi-sites, when the queue driver is set to anything other than sync.

When the DefaultInvalidator class passes down the invalidation rules from the config, it does so without specifying the domain in which the URLs should be invalidated.

$this->cacher->invalidateUrls(
Arr::get($this->rules, "collections.{$entry->collectionHandle()}.urls")
);

The invalidateUrls method attempts to get the domain from the invalidation URLs in the config (which is why the mentioned workaround works).

When an invalidation rule doesn't include a domain, it'll attempt to get the site's "base URL" using AbstractCacher::getBaseUrl():

publicfunctiongetBaseUrl()
{
// Check 'base_url' for backward compatibility.
if (! $baseUrl = $this->config('base_url')) {
// This could potentially just be Site::current()->absoluteUrl() but at the
// moment that method gets the URL based on the request. For now, we will
// manually get it from the config, as to not break any existing sites.
$baseUrl = Str::startsWith($url = Site::current()->url(), '/')
? Str::removeRight(config('app.url'), '/').$url
: $url;
}
returnrtrim($baseUrl, '/');
}

This method then calls Site::current() which gets the domain by getting the current site, based on the request URL.

However, since we're in the context of a queue, there is no request, so Statamic falls back to the "default" site URL, which causes the path on the intended site to not get invalidated (intended being the site the entry is associated with).

This pull request attempts to fix this by including the domain in the array of URLs passed to invalidateUrls.

Fixes#7691.
Replaces #10517.

@duncanmcclean
duncanmcclean marked this pull request as draft August 20, 2024 14:54
@duncanmcclean
duncanmcclean marked this pull request as ready for review August 27, 2024 14:58
@duncanmcclean

duncanmcclean commented Aug 27, 2024

Copy link
Copy Markdown
MemberAuthor

This is ready for review now.

The only thing I noticed while testing this PR on a real site was the fact that the GlobalVariablesSaved event is dispatched for every site whenever one site's globals are updated.

This means that whenever you update a global set, the global set will be invalidated in all sites, rather than just the site the global was just updated in.

I've opened a separate issue for that, as it'll likely require a breaking change in order to fix: #10888


Update: The above issue has been addressed in v6 (#11585).

@stuartcusackie

Copy link
Copy Markdown

Any chance of pushing this one through? I have a client who has had issues with static caching on their multisite for years now. Not sure if this PR will solve it but I am hopeful!

Comment threadsrc/StaticCaching/DefaultInvalidator.php Outdated
Comment threadsrc/StaticCaching/DefaultInvalidator.php Outdated
@wautersj

Copy link
Copy Markdown

Any idea on when this might be part of a V5 release?
I'm now facing this issue in 4 client sites.

In the meanwhile, a suggestion on a temp fix?

@jasonvarga
jasonvarga merged commit 7ab6702 into 5.xApr 22, 2025
@duncanmcclean
duncanmcclean deleted the fix/static-caching-invalidation-for-multisites branch April 22, 2025 13:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cache is not getting invalidated in Multisite setup

4 participants

@duncanmcclean@stuartcusackie@wautersj@jasonvarga
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); [5.x] Fix static caching invalidation for multi-sites by duncanmcclean · Pull Request #10669 · statamic/cms · GitHub
Skip to content

[5.x] Fix static caching invalidation for multi-sites - #10669

Merged
jasonvarga merged 26 commits into
5.xfrom
fix/static-caching-invalidation-for-multisites
Apr 22, 2025
Merged

[5.x] Fix static caching invalidation for multi-sites#10669
jasonvarga merged 26 commits into
5.xfrom
fix/static-caching-invalidation-for-multisites

Conversation

@duncanmcclean

Copy link
Copy Markdown
Member

This pull request fixes some issues around Static Caching invalidation & Multi-sites, when the queue driver is set to anything other than sync.

When the DefaultInvalidator class passes down the invalidation rules from the config, it does so without specifying the domain in which the URLs should be invalidated.

$this->cacher->invalidateUrls(
Arr::get($this->rules, "collections.{$entry->collectionHandle()}.urls")
);

The invalidateUrls method attempts to get the domain from the invalidation URLs in the config (which is why the mentioned workaround works).

When an invalidation rule doesn't include a domain, it'll attempt to get the site's "base URL" using AbstractCacher::getBaseUrl():

publicfunctiongetBaseUrl()
{
// Check 'base_url' for backward compatibility.
if (! $baseUrl = $this->config('base_url')) {
// This could potentially just be Site::current()->absoluteUrl() but at the
// moment that method gets the URL based on the request. For now, we will
// manually get it from the config, as to not break any existing sites.
$baseUrl = Str::startsWith($url = Site::current()->url(), '/')
? Str::removeRight(config('app.url'), '/').$url
: $url;
}
returnrtrim($baseUrl, '/');
}

This method then calls Site::current() which gets the domain by getting the current site, based on the request URL.

However, since we're in the context of a queue, there is no request, so Statamic falls back to the "default" site URL, which causes the path on the intended site to not get invalidated (intended being the site the entry is associated with).

This pull request attempts to fix this by including the domain in the array of URLs passed to invalidateUrls.

Fixes#7691.
Replaces #10517.

@duncanmcclean
duncanmcclean marked this pull request as draft August 20, 2024 14:54
@duncanmcclean
duncanmcclean marked this pull request as ready for review August 27, 2024 14:58
@duncanmcclean

duncanmcclean commented Aug 27, 2024

Copy link
Copy Markdown
MemberAuthor

This is ready for review now.

The only thing I noticed while testing this PR on a real site was the fact that the GlobalVariablesSaved event is dispatched for every site whenever one site's globals are updated.

This means that whenever you update a global set, the global set will be invalidated in all sites, rather than just the site the global was just updated in.

I've opened a separate issue for that, as it'll likely require a breaking change in order to fix: #10888


Update: The above issue has been addressed in v6 (#11585).

@stuartcusackie

Copy link
Copy Markdown

Any chance of pushing this one through? I have a client who has had issues with static caching on their multisite for years now. Not sure if this PR will solve it but I am hopeful!

Comment threadsrc/StaticCaching/DefaultInvalidator.php Outdated
Comment threadsrc/StaticCaching/DefaultInvalidator.php Outdated
@wautersj

Copy link
Copy Markdown

Any idea on when this might be part of a V5 release?
I'm now facing this issue in 4 client sites.

In the meanwhile, a suggestion on a temp fix?

@jasonvarga
jasonvarga merged commit 7ab6702 into 5.xApr 22, 2025
@duncanmcclean
duncanmcclean deleted the fix/static-caching-invalidation-for-multisites branch April 22, 2025 13:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cache is not getting invalidated in Multisite setup

4 participants

@duncanmcclean@stuartcusackie@wautersj@jasonvarga