Long-standing upstream issues resolved
Last updated Edit this page View as Markdown
Open issues in the archived mod_pagespeed and ngx_pagespeed trackers that current mod_pagespeed resolves, with each fix and the release that shipped it.
On this page
The Apache Incubator trackers for mod_pagespeed and ngx_pagespeed are archived and read-only. Nobody can close an issue there any more, so reports that current mod_pagespeed has resolved still show as open. This page lists them by their original URL, with the change that resolved each one and the release that shipped it.
Rows link to their source: an entry in the module’s CHANGELOG, an entry in these docs’ release notes, or the source file that carries the change. Rows marked likely fix the cause the report describes, but nobody has checked them against the reporter’s exact setup. Issues we could not tie to a specific change are left out, even where they probably no longer occur.
Release numbers are module releases: 1.1.0 (May 2026, the first general-availability release), the 1.15 line (1.15.0 to 1.15.0+r22), and 2.1.0 onward. See the release notes for the full history.
If you still hit one of these on a current release, open an issue in We-Amp/mod_pagespeed with your version, server and a reproduction.
Build, packaging and platforms
| Upstream issue | What changed | Shipped in |
|---|---|---|
| mod #2094, #2043: the Google apt repository fails with GPG and “no longer signed” errors | Signed deb and rpm packages from a maintained repository, packages.modpagespeed.com. Since 2.5.0, apt-get install mod-pagespeed replaces the archived Google package in one step, and dnf swap mod-pagespeed-stable mod-pagespeed does so on Enterprise Linux. See Migrate from the archived Google module. | 1.1.0 (release notes); one-step move in 2.5.0 (CHANGELOG, “Moving from Google’s archived package works in one step”) |
| ngx #1615, #1735, #1743, #1758, #1762; mod #2083: the module does not build, or builds but does not load, against newer nginx or glibc | A prebuilt, signed nginx module for each supported distribution’s stock nginx, so nothing needs compiling there. For an nginx from another source, the module builds from the released source tarball against the supported nginx versions; see Install on Apache and nginx and build from source. | 1.1.0 (release notes, “Prebuilt, signed packages”); per-distribution builds in 1.1.0+r18 (release notes, “Packaging”) |
| ngx #1121, #1135, #1250, #1297, #1740: building ngx_pagespeed as a dynamic module fails | The nginx module ships as a dynamic module, and the package loads it for you. | 1.1.0 (release notes, “a prebuilt dynamic module for stock nginx”) |
| ngx #637, #661, #704: no packages for a distribution’s own nginx, no yum repository, no installer or updater | Signed apt and yum repositories for the nginx module, with a build for each distribution’s stock nginx. Updates arrive through the package manager. | 1.1.0+r18 (release notes, “Packaging”) |
| ngx #1213, #1745, #1763: no ARM64 (aarch64) build | arm64/aarch64 builds for Apache and nginx on Linux. The aarch64 nginx module rpm for Enterprise Linux 9 followed in 1.15.0+r11. | 1.1.0 (release notes, “arm64/aarch64 support”); EL9 rpm in 1.15.0+r11 (release notes) |
| mod #1753, #1844: the bundled libwebp is out of date | The bundled image libraries were updated, libwebp to 1.5.0. | 1.1.0 (release notes, “Security”) |
Caching and headers
| Upstream issue | What changed | Shipped in |
|---|---|---|
| mod #1332, #1503, #1648, #1936; ngx #1516: the file cache cleaner loads the disk, the cache grows past its limit, file names get too long, and the log fills with lock-file and cache-clean errors | The file-per-entry disk cache is replaced by Cyclone Cache, a fixed-size, memory-mapped cache with no periodic cleanup passes. FileCachePath keeps working and now locates the Cyclone cache. | 1.1.0 (release notes, “Cyclone Cache”) |
| mod #1855 (likely): the module fails under SELinux in enforcing mode | The error in the report (“Failed to mkdir … outputlock”) came from the old cache’s lock files, which no longer exist. | 1.1.0 (release notes, “Cyclone Cache”) |
mod #1287: respect s-maxage (the s-maxage half of the report) | s-maxage is honored for shared-cache freshness. It can only shorten the lifetime set by max-age or Expires, and s-maxage=0 keeps a response out of the cache. Age is not covered. | 2.5.0 (CHANGELOG, Changed) |
ngx #1271: Vary: Accept-Encoding repeated on optimized resources | The nginx module’s filters run at their intended place in nginx’s filter chain, so responses carry exactly one Vary: Accept-Encoding. | 2.2.0 (CHANGELOG, “nginx: the module’s filters run at their intended place in nginx’s filter chain”) |
ngx #1589: Cache-Control: immutable | Optimized .pagespeed. resources declare Cache-Control: public, immutable next to their one-year max-age. | 1.15.0+r22 (CHANGELOG, “Optimized .pagespeed. resources now declare Cache-Control: public, immutable”) |
| mod #1704: a TTL for Redis keys | RedisTTLSec sets an expiry on the keys the module writes to Redis. This was fixed in the upstream code in 2019 (commit 7659ff7, “Fixes #1704”), but the issue was never closed. | Upstream code, 2019; in every release of the maintained module (system_rewrite_options.cc) |
| mod #1622, #1024: redirects pick up repeated or unwanted PageSpeed query parameters | They are added back to a same-site Location only when the target does not already carry them, and before any #fragment. A redirect that deliberately drops them is left as the origin wrote it. | 2.7.0 (CHANGELOG, “Redirects no longer pick up repeated or unwanted PageSpeed query parameters”) |
| mod #1760, #1988: duplicate headers on resource and admin responses | An AddResourceHeader for a header the origin already sent now replaces it. On Apache, X-Content-Type-Options: nosniff is no longer repeated on admin, optimizer JSON and in-place optimized responses. | 2.7.0 (CHANGELOG, “Resource and admin responses carry each header once”) |
mod #1221: extend_cache_images does not cover SVG images | extend_cache_images covers SVG images, including SVG referenced from stylesheets: a content-hashed URL and a long cache lifetime, bytes and content type unchanged. | 2.7.0 (CHANGELOG, “extend_cache_images now also covers SVG images”) |
Filters
| Upstream issue | What changed | Shipped in |
|---|---|---|
| mod #2051, #1505; ngx #1663: use the browser’s native lazy loading instead of a placeholder image and a script | lazyload_images has a native mode that writes loading="lazy" on below-the-fold images, so the real image URL stays in src. LazyloadImagesMode chooses it (auto, the default, uses it where the browser supports native lazy loading). | 1.15.0+r18 (release notes, “lazyload_images gains a native mode”) |
mod #1773, #1514: inline_javascript inlines scripts that carry defer | inline_javascript no longer inlines external scripts that carry async or defer, which would turn a deferred script into a blocking one and leave an attribute that is invalid on an inline script. | 1.15.0+r20 (release notes, “inline_javascript no longer inlines external scripts carrying async or defer”) |
mod #1992: “Unrecognized script” messages for application/ld+json blocks | Data-only script blocks (JSON-LD, JSON data, import maps, speculation rules, templates) no longer log the “Unrecognized script” message (javascript_filter.cc). | 1.15.0+r21 (release notes, “Data-only <script> blocks … no longer emit a spurious ‘Unrecognized script’ info message”) |
ngx #1537: add_instrumentation uses the deprecated chrome.loadTimes() | The instrumentation beacon measures with the standard performance APIs and reports Core Web Vitals (add_instrumentation.js). | 1.15.0+r20 (release notes, “Core Web Vitals reporting from the instrumentation beacon”) |
mod #1887: combine_javascript breaks scripts that declare top-level const, let or class | Such scripts are now left uncombined. | 2.7.0 (CHANGELOG, “combine_javascript no longer breaks scripts that declare top-level”) |
mod #1971, #2066: rewrite_css changes CSS custom properties | Custom properties stay exactly as written: names such as --Test and --test stay distinct, and their values are no longer minified. | 2.7.0 (CHANGELOG, “rewrite_css keeps CSS custom properties exactly as written”) |
| mod #1800, #520: minification removes licence and copyright comments | Block comments that start with /*! or contain @license or @preserve are kept in JavaScript and CSS, in single-file and combined output. | 2.7.0 (CHANGELOG, “JavaScript minification keeps licence comments” and “CSS minification keeps licence comments”) |
| mod #1316, #1977: “pagespeed is not defined” errors in the browser | Image handlers and the small inline scripts these filters add check that the support script ran first, so a page where it is blocked or stripped no longer logs the error. | 2.7.0 (CHANGELOG, “Image handlers no longer throw” and “Inline scripts added by the image and iframe filters no longer throw”) |
ngx #1619: the integrity attribute is not respected | Stylesheets and scripts with an integrity attribute are left as written. | 2.7.0 (CHANGELOG, “Stylesheets and scripts with an integrity attribute are no longer changed”) |
mod #1528, #1275, #1880: problems with local_storage_cache, including a cookie that grows too large | The filter is retired. Its name is still accepted and ignored with a warning, so existing configurations keep loading. | 2.7.0 (CHANGELOG, “local_storage_cache is retired”) |
mod #1867: use font-display: swap when inlining Google Fonts | inline_google_font_css requests display=swap when the loader URL sets no display=. An explicit display= is kept. | 2.7.0 (CHANGELOG, “inline_google_font_css: a Google Fonts loader URL without a display= parameter is now requested with display=swap”) |
mod #2073, #2068: inlined images lose their width and height | Inlined images keep their width and height attributes, so browsers can reserve layout space. | 2.7.0 (CHANGELOG, “rewrite_images: inlined images now keep their width and height attributes”) |
Reload, robustness and configuration
| Upstream issue | What changed | Shipped in |
|---|---|---|
| mod #1775: deadlock in shared-memory statistics | Fixes a hang that could block all server processes until a restart (Linux and FreeBSD). | 2.2.0 (CHANGELOG, Fixed) |
ngx #387 (likely): pagespeed on/off in nested location blocks | Nested locations and if blocks inherit the enclosing location’s pagespeed settings, and pagespeed directives set in the nested block itself apply there, as for any other nginx module. | 2.6.0 (CHANGELOG, Changed) |
| ngx #1380: an nginx worker spins at 100% CPU | An nginx worker no longer spins at 100% CPU when the module’s internal event channel is busy. | In the code since July 2026, and in every release from 1.15.0+r18 on |
| ngx #1720: “URL is not in cache” lines flood the message history | Per-request in-place optimization hit and miss lines are written at debug level on nginx and IIS. | 2.7.0 (CHANGELOG, “In-place optimization no longer floods the message history”) |