# Long-standing upstream issues resolved

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.

Canonical URL: https://modpagespeed.com/docs/upstream-issues-resolved/

The Apache Incubator trackers for
[mod_pagespeed](https://github.com/apache/incubator-pagespeed-mod/issues) and
[ngx_pagespeed](https://github.com/apache/incubator-pagespeed-ngx/issues) 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](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md),
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](https://modpagespeed.com/docs/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](https://github.com/We-Amp/mod_pagespeed/issues) with your
version, server and a reproduction.

## Build, packaging and platforms

| Upstream issue | What changed | Shipped in |
| --- | --- | --- |
| mod [#2094](https://github.com/apache/incubator-pagespeed-mod/issues/2094), [#2043](https://github.com/apache/incubator-pagespeed-mod/issues/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](https://modpagespeed.com/docs/migrate-from-google-mod-pagespeed/). | 1.1.0 ([release notes](https://modpagespeed.com/docs/release-notes-1-1/#v1-1-0)); one-step move in 2.5.0 ([CHANGELOG](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#250---2026-10-19), "Moving from Google's archived package works in one step") |
| ngx [#1615](https://github.com/apache/incubator-pagespeed-ngx/issues/1615), [#1735](https://github.com/apache/incubator-pagespeed-ngx/issues/1735), [#1743](https://github.com/apache/incubator-pagespeed-ngx/issues/1743), [#1758](https://github.com/apache/incubator-pagespeed-ngx/issues/1758), [#1762](https://github.com/apache/incubator-pagespeed-ngx/issues/1762); mod [#2083](https://github.com/apache/incubator-pagespeed-mod/issues/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](https://modpagespeed.com/docs/worker-configuration/#which-nginx-version); see [Install on Apache and nginx](https://modpagespeed.com/docs/installation-module/) and [build from source](https://ngxpagespeed.com/install/from-source/). | 1.1.0 ([release notes](https://modpagespeed.com/docs/release-notes-1-1/#v1-1-0), "Prebuilt, signed packages"); per-distribution builds in 1.1.0+r18 ([release notes](https://modpagespeed.com/docs/release-notes-1-1/#v1-1-0-r18-r21), "Packaging") |
| ngx [#1121](https://github.com/apache/incubator-pagespeed-ngx/issues/1121), [#1135](https://github.com/apache/incubator-pagespeed-ngx/issues/1135), [#1250](https://github.com/apache/incubator-pagespeed-ngx/issues/1250), [#1297](https://github.com/apache/incubator-pagespeed-ngx/issues/1297), [#1740](https://github.com/apache/incubator-pagespeed-ngx/issues/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](https://modpagespeed.com/docs/release-notes-1-1/#v1-1-0), "a prebuilt dynamic module for stock nginx") |
| ngx [#637](https://github.com/apache/incubator-pagespeed-ngx/issues/637), [#661](https://github.com/apache/incubator-pagespeed-ngx/issues/661), [#704](https://github.com/apache/incubator-pagespeed-ngx/issues/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](https://modpagespeed.com/docs/release-notes-1-1/#v1-1-0-r18-r21), "Packaging") |
| ngx [#1213](https://github.com/apache/incubator-pagespeed-ngx/issues/1213), [#1745](https://github.com/apache/incubator-pagespeed-ngx/issues/1745), [#1763](https://github.com/apache/incubator-pagespeed-ngx/issues/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](https://modpagespeed.com/docs/release-notes-1-1/#v1-1-0), "arm64/aarch64 support"); EL9 rpm in 1.15.0+r11 ([release notes](https://modpagespeed.com/docs/release-notes-1-15/#v1-15-0-r11-r14)) |
| mod [#1753](https://github.com/apache/incubator-pagespeed-mod/issues/1753), [#1844](https://github.com/apache/incubator-pagespeed-mod/issues/1844): the bundled libwebp is out of date | The bundled image libraries were updated, libwebp to 1.5.0. | 1.1.0 ([release notes](https://modpagespeed.com/docs/release-notes-1-1/#v1-1-0), "Security") |

## Caching and headers

| Upstream issue | What changed | Shipped in |
| --- | --- | --- |
| mod [#1332](https://github.com/apache/incubator-pagespeed-mod/issues/1332), [#1503](https://github.com/apache/incubator-pagespeed-mod/issues/1503), [#1648](https://github.com/apache/incubator-pagespeed-mod/issues/1648), [#1936](https://github.com/apache/incubator-pagespeed-mod/issues/1936); ngx [#1516](https://github.com/apache/incubator-pagespeed-ngx/issues/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](https://modpagespeed.com/docs/release-notes-1-1/#v1-1-0), "Cyclone Cache") |
| mod [#1855](https://github.com/apache/incubator-pagespeed-mod/issues/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](https://modpagespeed.com/docs/release-notes-1-1/#v1-1-0), "Cyclone Cache") |
| mod [#1287](https://github.com/apache/incubator-pagespeed-mod/issues/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](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#250---2026-10-19), Changed) |
| ngx [#1271](https://github.com/apache/incubator-pagespeed-ngx/issues/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](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#220---2026-10-06), "nginx: the module's filters run at their intended place in nginx's filter chain") |
| ngx [#1589](https://github.com/apache/incubator-pagespeed-ngx/issues/1589): `Cache-Control: immutable` | Optimized `.pagespeed.` resources declare `Cache-Control: public, immutable` next to their one-year `max-age`. | 1.15.0+r22 ([CHANGELOG](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#1150r22---2026-08-08), "Optimized `.pagespeed.` resources now declare `Cache-Control: public, immutable`") |
| mod [#1704](https://github.com/apache/incubator-pagespeed-mod/issues/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`](https://github.com/We-Amp/mod_pagespeed/commit/7659ff743638781f847e37500b8a7093fb49a2f8), "Fixes #1704"), but the issue was never closed. | Upstream code, 2019; in every release of the maintained module ([`system_rewrite_options.cc`](https://github.com/We-Amp/mod_pagespeed/blob/v2.6.0/pagespeed/system/system_rewrite_options.cc)) |
| mod [#1622](https://github.com/apache/incubator-pagespeed-mod/issues/1622), [#1024](https://github.com/apache/incubator-pagespeed-mod/issues/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](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#270---2026-10-31), "Redirects no longer pick up repeated or unwanted PageSpeed query parameters") |
| mod [#1760](https://github.com/apache/incubator-pagespeed-mod/issues/1760), [#1988](https://github.com/apache/incubator-pagespeed-mod/issues/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](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#270---2026-10-31), "Resource and admin responses carry each header once") |
| mod [#1221](https://github.com/apache/incubator-pagespeed-mod/issues/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](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#270---2026-10-31), "`extend_cache_images` now also covers SVG images") |

## Filters

| Upstream issue | What changed | Shipped in |
| --- | --- | --- |
| mod [#2051](https://github.com/apache/incubator-pagespeed-mod/issues/2051), [#1505](https://github.com/apache/incubator-pagespeed-mod/issues/1505); ngx [#1663](https://github.com/apache/incubator-pagespeed-ngx/issues/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](https://modpagespeed.com/docs/release-notes-1-15/#v1-15-0-r18), "`lazyload_images` gains a native mode") |
| mod [#1773](https://github.com/apache/incubator-pagespeed-mod/issues/1773), [#1514](https://github.com/apache/incubator-pagespeed-mod/issues/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](https://modpagespeed.com/docs/release-notes-1-15/#v1-15-0-r20), "`inline_javascript` no longer inlines external scripts carrying `async` or `defer`") |
| mod [#1992](https://github.com/apache/incubator-pagespeed-mod/issues/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`](https://github.com/We-Amp/mod_pagespeed/blob/v2.6.0/net/instaweb/rewriter/javascript_filter.cc)). | 1.15.0+r21 ([release notes](https://modpagespeed.com/docs/release-notes-1-15/#v1-15-0-r21), "Data-only `<script>` blocks … no longer emit a spurious 'Unrecognized script' info message") |
| ngx [#1537](https://github.com/apache/incubator-pagespeed-ngx/issues/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`](https://github.com/We-Amp/mod_pagespeed/blob/v2.6.0/net/instaweb/rewriter/add_instrumentation.js)). | 1.15.0+r20 ([release notes](https://modpagespeed.com/docs/release-notes-1-15/#v1-15-0-r20), "Core Web Vitals reporting from the instrumentation beacon") |
| mod [#1887](https://github.com/apache/incubator-pagespeed-mod/issues/1887): `combine_javascript` breaks scripts that declare top-level `const`, `let` or `class` | Such scripts are now left uncombined. | 2.7.0 ([CHANGELOG](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#270---2026-10-31), "`combine_javascript` no longer breaks scripts that declare top-level") |
| mod [#1971](https://github.com/apache/incubator-pagespeed-mod/issues/1971), [#2066](https://github.com/apache/incubator-pagespeed-mod/issues/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](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#270---2026-10-31), "`rewrite_css` keeps CSS custom properties exactly as written") |
| mod [#1800](https://github.com/apache/incubator-pagespeed-mod/issues/1800), [#520](https://github.com/apache/incubator-pagespeed-mod/issues/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](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#270---2026-10-31), "JavaScript minification keeps licence comments" and "CSS minification keeps licence comments") |
| mod [#1316](https://github.com/apache/incubator-pagespeed-mod/issues/1316), [#1977](https://github.com/apache/incubator-pagespeed-mod/issues/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](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#270---2026-10-31), "Image handlers no longer throw" and "Inline scripts added by the image and iframe filters no longer throw") |
| ngx [#1619](https://github.com/apache/incubator-pagespeed-ngx/issues/1619): the `integrity` attribute is not respected | Stylesheets and scripts with an `integrity` attribute are left as written. | 2.7.0 ([CHANGELOG](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#270---2026-10-31), "Stylesheets and scripts with an `integrity` attribute are no longer changed") |
| mod [#1528](https://github.com/apache/incubator-pagespeed-mod/issues/1528), [#1275](https://github.com/apache/incubator-pagespeed-mod/issues/1275), [#1880](https://github.com/apache/incubator-pagespeed-mod/issues/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](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#270---2026-10-31), "`local_storage_cache` is retired") |
| mod [#1867](https://github.com/apache/incubator-pagespeed-mod/issues/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](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#270---2026-10-31), "`inline_google_font_css`: a Google Fonts loader URL without a `display=` parameter is now requested with `display=swap`") |
| mod [#2073](https://github.com/apache/incubator-pagespeed-mod/issues/2073), [#2068](https://github.com/apache/incubator-pagespeed-mod/issues/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](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#270---2026-10-31), "`rewrite_images`: inlined images now keep their `width` and `height` attributes") |

## Reload, robustness and configuration

| Upstream issue | What changed | Shipped in |
| --- | --- | --- |
| mod [#1775](https://github.com/apache/incubator-pagespeed-mod/issues/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](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#220---2026-10-06), Fixed) |
| ngx [#387](https://github.com/apache/incubator-pagespeed-ngx/issues/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](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#260---2026-10-28), Changed) |
| ngx [#1380](https://github.com/apache/incubator-pagespeed-ngx/issues/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](https://github.com/apache/incubator-pagespeed-ngx/issues/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](https://github.com/We-Amp/mod_pagespeed/blob/master/CHANGELOG.md#270---2026-10-31), "In-place optimization no longer floods the message history") |
