Repository navigation
v26.9.1
Breaking changes
$app->query()now returns published content only, a theme that omitted->published()no longer lists draft titles, excerpts, and bodies; call->anyStatus()to include unpublished content$ava->get()no longer returns drafts, the template helper now applies the router's visibility rule and returnsnullfor unpublished items- Only PHP's own session cookie bypasses the webpage cache, previously any cookie did, so a single analytics cookie cost every returning visitor the cache; pages that genuinely vary per visitor must send
Varyor their ownCache-Control, or be listed inwebpage_cache.exclude - Binary cache files are now signed, caches written by earlier versions carry no signature and read as empty, so run
./ava rebuildafter upgrading by hand (./ava updaterebuilds for you) - The
WebpageCacheAPI is consolidated,tryCachedResponse(),getWithoutFullCheck(),isCacheableForRead(), andisCacheableForWrite()are replaced byget()andisCacheable(), andput()now returnsbool
New features
- Add
Query::anyStatus()to include unpublished content in a query, for callers that have their own access control - Add
webpage_cache.hostsconfiguration option listing additional hostnames allowed to populate the page cache
Bug fixes & improvements
- Sign binary cache files with HMAC-SHA256 and deserialise with
allowed_classes => false - Restrict
Repository::recentMeta()to published content,allMeta()still returns every status - Require content-item paths to resolve inside the content root in
Repository::get(), matchinggetByFile() - Ignore request
Cache-ControlandPragmaheaders, which previously let any visitor force a full render on every request (RFC 9111 §5.2.1.4 permits a shared cache to ignore them) - Scope the webpage cache to the hostname in
site.base_url, preventing arbitraryHostheaders from filling the cache directory with near-duplicate entries - Cache archive pagination under its own key,
?paged=Nis now stored instead of refused, and?paged=1shares the bare URL's entry - Return 404 for archive and taxonomy pages requested past the last page, instead of rendering an empty listing for any
?pagedvalue - Stop persisting headers queued by PHP into cached entries, which replayed
X-Powered-Byand one-offheader()calls to every later visitor - Default
generator_commenttofalse, so the exact version is no longer published on every page, and apply the same setting to theX-Render-Timeheader - Honour
cache: 0,cache: "no", andcache: "off"in frontmatter, previously only the YAML booleanfalsedisabled the page cache for an item - Load plugins before checking content index freshness, so a request that triggers a stale-cache rebuild no longer rebuilds without plugin-provided content types and routes
- Remove the duplicate pre-bootstrap cache implementation from
public/index.php, leaving a single cache policy inWebpageCache; manual index mode still serves hits before the application boots - Share query execution between the array and SQLite backends through
QueryProcessor, with parity tests across both - Correct the router's documented matching order, which listed prefix routes seventh when they are matched second, and remove a reference to an
autocontent index backend that has never existed - Consolidated the test suite, replacing tests that asserted on literals declared in their own bodies with coverage of draft visibility, cache keying, host scoping, and cache signing (441 tests total)
Full Changelog: v26.9.0...v26.9.1
❗This project is under very early, active development and may contain bugs or security issues.
❗It is likely not ready for production websites.
You are responsible for reviewing, testing, and securing any deployment. Ava CMS is provided as free, open-source software without warranty (GNU General Public License), see LICENSE.