next-runtime icon indicating copy to clipboard operation
next-runtime copied to clipboard

[Bug]: next/image not working. TypeError - Invalid URL: http://

Open brunocalou opened this issue 3 years ago • 2 comments

Summary

Hello, I'm migrating a site from Vercel to Netlify, but the images do not work. I'm using the next/image component, and it shows the following error on runtime: [TypeError](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError) - Invalid URL: http://. It's happening to local and subdomain images.

Here is the full error:

{
  "errorType": "TypeError",
  "errorMessage": "Invalid URL: http://",
  "trace": [
    "TypeError [ERR_INVALID_URL]: Invalid URL: http://",
    "    at new NodeError (internal/errors.js:322:7)",
    "    at onParseError (internal/url.js:270:9)",
    "    at new URL (internal/url.js:346:5)",
    "    at /var/task/node_modules/ipx/dist/chunks/middleware.cjs:131:12",
    "    at Array.map (<anonymous>)",
    "    at createHTTPSource (/var/task/node_modules/ipx/dist/chunks/middleware.cjs:127:28)",
    "    at createIPX (/var/task/node_modules/ipx/dist/chunks/middleware.cjs:423:24)",
    "    at createIPXHandler (/var/task/node_modules/@netlify/ipx/dist/index.js:16:37)",
    "    at Object.<anonymous> (/var/task/.netlify/functions-internal/_ipx/_ipx.js:7:46)",
    "    at Module._compile (internal/modules/cjs/loader.js:1085:14)"
  ]
}

Here is a link to a local image

And here is another link to an external image

Steps to reproduce

  1. Go to https://resilient-cranachan-3c07af.netlify.app
  2. Images do not work

A link to a reproduction repository

No response

Plugin version

^4.9.3

More information about your build

  • [ ] I am building using the CLI
  • [x] I am building using file-based configuration (netlify.toml)

What OS are you using?

No response

Your netlify.toml file

`netlify.toml`
[[plugins]]
package = "@netlify/plugin-nextjs"

[build]
  command = "npm run build"
  publish = ".next"

Your public/_redirects file

`_redirects`
# Paste content of your `_redirects` file here

Your next.config.js file

`next.config.js`
const withSvgr = require("next-svgr");
const { withPlausibleProxy } = require('next-plausible')
const withBundleAnalyzer = require('@next/bundle-analyzer')({
  enabled: process.env.ANALYZE === 'true',
})

const securityHeaders = [
  {
    key: 'X-DNS-Prefetch-Control',
    value: 'on'
  },
  {
    key: 'Strict-Transport-Security',
    value: 'max-age=63072000; includeSubDomains; preload'
  },
  {
    key: 'X-XSS-Protection',
    value: '1; mode=block'
  },
  {
    key: 'X-Frame-Options',
    value: 'SAMEORIGIN'
  },
  {
    key: 'Permissions-Policy',
    value: '',
  },
  {
    key: 'X-Content-Type-Options',
    value: 'nosniff'
  },
];

module.exports = withBundleAnalyzer(
  withPlausibleProxy({
    customDomain: "https://ec2-18-117-11-139.us-east-2.compute.amazonaws.com",
  })(
    withSvgr({
      reactStrictMode: true,
      compiler: {
        styledComponents: true,
      },
      async headers() {
        return [
          {
            source: '/(.*)',
            headers: securityHeaders,
          },
        ]
      },
      images: {
        domains: [
          `${process.env.S3_UPLOAD_BUCKET}.s3.amazonaws.com`,
          `${process.env.S3_UPLOAD_BUCKET}.s3.${process.env.S3_UPLOAD_REGION}.amazonaws.com`,
          'content.tabwhale.com',
          '', // make blob image work
        ],
      },
    })
  )
);

Builds logs (or link to your logs)

Build logs
6:44:11 PM: Build ready to start
6:44:13 PM: build-image version: 72a309a113b53ef075815b129953617827965e48 (focal)
6:44:13 PM: build-image tag: v4.8.2
6:44:13 PM: buildbot version: 72ebfe61ef7a5152002962d9129cc52f5b1bb560
6:44:13 PM: Fetching cached dependencies
6:44:13 PM: Failed to fetch cache, continuing with build
6:44:13 PM: Starting to prepare the repo for build
6:44:14 PM: No cached dependencies found. Cloning fresh repo
6:44:14 PM: git clone https://github.com/brunocalou/tabwhale
6:44:16 PM: Preparing Git Reference refs/heads/main
6:44:16 PM: Parsing package.json dependencies
6:44:17 PM: Starting build script
6:44:17 PM: Installing dependencies
6:44:17 PM: Python version set to 2.7
6:44:18 PM: v16.15.1 is already installed.
6:44:18 PM: Now using node v16.15.1 (npm v8.11.0)
6:44:18 PM: Started restoring cached build plugins
6:44:18 PM: Finished restoring cached build plugins
6:44:18 PM: Attempting ruby version 2.7.2, read from environment
6:44:19 PM: Using ruby version 2.7.2
6:44:20 PM: Using PHP version 8.0
6:44:20 PM: No npm workspaces detected
6:44:20 PM: Started restoring cached node modules
6:44:20 PM: Finished restoring cached node modules
6:44:20 PM: Installing NPM modules using NPM version 8.11.0
6:44:21 PM: npm WARN config tmp This setting is no longer used.  npm stores temporary files in a special
6:44:21 PM: npm WARN config location in the cache, and they are managed by
6:44:21 PM: npm WARN config     [`cacache`](http://npm.im/cacache).
6:44:21 PM: npm WARN config tmp This setting is no longer used.  npm stores temporary files in a special
6:44:21 PM: npm WARN config location in the cache, and they are managed by
6:44:21 PM: npm WARN config     [`cacache`](http://npm.im/cacache).
6:44:24 PM: npm WARN ERESOLVE overriding peer dependency
6:44:24 PM: npm WARN While resolving: @next-auth/[email protected]
6:44:24 PM: npm WARN Found: @prisma/[email protected]
6:44:24 PM: npm WARN node_modules/@prisma/client
6:44:24 PM: npm WARN   @prisma/client@"^3.3.0" from the root project
6:44:24 PM: npm WARN   1 more (@next-auth/prisma-adapter)
6:44:24 PM: npm WARN
6:44:24 PM: npm WARN Could not resolve dependency:
6:44:24 PM: npm WARN peer @prisma/client@"^2.16.1" from @next-auth/[email protected]
6:44:24 PM: npm WARN node_modules/@next-auth/prisma-legacy-adapter
6:44:24 PM: npm WARN   @next-auth/prisma-legacy-adapter@"0.1.2" from [email protected]
6:44:24 PM: npm WARN   node_modules/next-auth
6:44:24 PM: npm WARN
6:44:24 PM: npm WARN Conflicting peer dependency: @prisma/[email protected]
6:44:24 PM: npm WARN node_modules/@prisma/client
6:44:24 PM: npm WARN   peer @prisma/client@"^2.16.1" from @next-auth/[email protected]
6:44:24 PM: npm WARN   node_modules/@next-auth/prisma-legacy-adapter
6:44:24 PM: npm WARN     @next-auth/prisma-legacy-adapter@"0.1.2" from [email protected]
6:44:24 PM: npm WARN     node_modules/next-auth
6:44:24 PM: npm WARN ERESOLVE overriding peer dependency
6:44:24 PM: npm WARN While resolving: @reach/[email protected]
6:44:24 PM: npm WARN Found: [email protected]
6:44:24 PM: npm WARN node_modules/react
6:44:24 PM: npm WARN   react@"^17.0.2" from the root project
6:44:24 PM: npm WARN   76 more (@emotion/core, @emotion/styled, @emotion/styled-base, ...)
6:44:24 PM: npm WARN
6:44:24 PM: npm WARN Could not resolve dependency:
6:44:24 PM: npm WARN peer react@"15.x || 16.x || 16.4.0-alpha.0911da3" from @reach/[email protected]
6:44:24 PM: npm WARN node_modules/@reach/router
6:44:24 PM: npm WARN   @reach/router@"^1.3.4" from @storybook/[email protected]
6:44:24 PM: npm WARN   node_modules/@storybook/api
6:44:24 PM: npm WARN   1 more (@storybook/router)
6:44:24 PM: npm WARN
6:44:24 PM: npm WARN Conflicting peer dependency: [email protected]
6:44:24 PM: npm WARN node_modules/react
6:44:24 PM: npm WARN   peer react@"15.x || 16.x || 16.4.0-alpha.0911da3" from @reach/[email protected]
6:44:24 PM: npm WARN   node_modules/@reach/router
6:44:24 PM: npm WARN     @reach/router@"^1.3.4" from @storybook/[email protected]
6:44:24 PM: npm WARN     node_modules/@storybook/api
6:44:24 PM: npm WARN     1 more (@storybook/router)
6:44:24 PM: npm WARN ERESOLVE overriding peer dependency
6:44:24 PM: npm WARN While resolving: @reach/[email protected]
6:44:24 PM: npm WARN Found: [email protected]
6:44:24 PM: npm WARN node_modules/react-dom
6:44:24 PM: npm WARN   react-dom@"^17.0.2" from the root project
6:44:24 PM: npm WARN   44 more (@next/react-dev-overlay, @react-three/drei, ...)
6:44:24 PM: npm WARN
6:44:24 PM: npm WARN Could not resolve dependency:
6:44:24 PM: npm WARN peer react-dom@"15.x || 16.x || 16.4.0-alpha.0911da3" from @reach/[email protected]
6:44:24 PM: npm WARN node_modules/@reach/router
6:44:24 PM: npm WARN   @reach/router@"^1.3.4" from @storybook/[email protected]
6:44:24 PM: npm WARN   node_modules/@storybook/api
6:44:24 PM: npm WARN   1 more (@storybook/router)
6:44:24 PM: npm WARN
6:44:24 PM: npm WARN Conflicting peer dependency: [email protected]
6:44:24 PM: npm WARN node_modules/react-dom
6:44:24 PM: npm WARN   peer react-dom@"15.x || 16.x || 16.4.0-alpha.0911da3" from @reach/[email protected]
6:44:24 PM: npm WARN   node_modules/@reach/router
6:44:24 PM: npm WARN     @reach/router@"^1.3.4" from @storybook/[email protected]
6:44:24 PM: npm WARN     node_modules/@storybook/api
6:44:24 PM: npm WARN     1 more (@storybook/router)
6:44:24 PM: npm WARN ERESOLVE overriding peer dependency
6:44:24 PM: npm WARN While resolving: [email protected]
6:44:24 PM: npm WARN Found: [email protected]
6:44:24 PM: npm WARN node_modules/react
6:44:24 PM: npm WARN   react@"^17.0.2" from the root project
6:44:24 PM: npm WARN   76 more (@emotion/core, @emotion/styled, @emotion/styled-base, ...)
6:44:24 PM: npm WARN
6:44:24 PM: npm WARN Could not resolve dependency:
6:44:24 PM: npm WARN peer react@"^0.14.0 || ^15.0.0 || ^16.0.0" from [email protected]
6:44:24 PM: npm WARN node_modules/create-react-context
6:44:24 PM: npm WARN   create-react-context@"0.3.0" from @reach/[email protected]
6:44:24 PM: npm WARN   node_modules/@reach/router
6:44:24 PM: npm WARN
6:44:24 PM: npm WARN Conflicting peer dependency: [email protected]
6:44:24 PM: npm WARN node_modules/react
6:44:24 PM: npm WARN   peer react@"^0.14.0 || ^15.0.0 || ^16.0.0" from [email protected]
6:44:24 PM: npm WARN   node_modules/create-react-context
6:44:24 PM: npm WARN     create-react-context@"0.3.0" from @reach/[email protected]
6:44:24 PM: npm WARN     node_modules/@reach/router
6:44:41 PM: npm WARN deprecated [email protected]: this library is no longer supported
6:44:42 PM: npm WARN deprecated [email protected]: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
6:44:43 PM: npm WARN deprecated [email protected]: request has been deprecated, see https://github.com/request/request/issues/3142
6:44:54 PM: npm WARN deprecated [email protected]: This SVGO version is no longer supported. Upgrade to v2.x.x.
6:45:01 PM: npm WARN deprecated [email protected]: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
6:45:10 PM: npm WARN deprecated [email protected]: Please see https://github.com/lydell/urix#deprecated
6:45:10 PM: npm WARN deprecated [email protected]: https://github.com/lydell/resolve-url#deprecated
6:45:36 PM: added 2788 packages, and audited 2789 packages in 1m
6:45:36 PM: 332 packages are looking for funding
6:45:36 PM:   run `npm fund` for details
6:45:36 PM: 55 vulnerabilities (4 low, 7 moderate, 36 high, 8 critical)
6:45:36 PM: To address issues that do not require attention, run:
6:45:36 PM:   npm audit fix
6:45:36 PM: To address all issues possible (including breaking changes), run:
6:45:36 PM:   npm audit fix --force
6:45:36 PM: Some issues need review, and may require choosing
6:45:36 PM: a different dependency.
6:45:36 PM: Run `npm audit` for details.
6:45:36 PM: NPM modules installed
6:45:36 PM: npm WARN config tmp This setting is no longer used.  npm stores temporary files in a special
6:45:36 PM: npm WARN config location in the cache, and they are managed by
6:45:36 PM: npm WARN config     [`cacache`](http://npm.im/cacache).
6:45:36 PM: Started restoring cached go cache
6:45:36 PM: Finished restoring cached go cache
6:45:37 PM: Installing Go version 1.17 (requested 1.17)
6:45:43 PM: unset GOOS;
6:45:43 PM: unset GOARCH;
6:45:43 PM: export GOROOT='/opt/buildhome/.gimme/versions/go1.17.linux.amd64';
6:45:43 PM: export PATH="/opt/buildhome/.gimme/versions/go1.17.linux.amd64/bin:${PATH}";
6:45:43 PM: go version >&2;
6:45:43 PM: export GIMME_ENV="/opt/buildhome/.gimme/env/go1.17.linux.amd64.env"
6:45:43 PM: go version go1.17 linux/amd64
6:45:43 PM: Installing missing commands
6:45:43 PM: Verify run directory
6:45:45 PM: ​
6:45:45 PM: ────────────────────────────────────────────────────────────────
6:45:45 PM:   Netlify Build                                                 
6:45:45 PM: ────────────────────────────────────────────────────────────────
6:45:45 PM: ​
6:45:45 PM: ❯ Version
6:45:45 PM:   @netlify/build 27.3.0
6:45:45 PM: ​
6:45:45 PM: ❯ Flags
6:45:45 PM:   baseRelDir: true
6:45:45 PM:   buildId: 62bb762b7b88f91eb09a2164
6:45:45 PM:   deployId: 62bb762b7b88f91eb09a2166
6:45:45 PM: ​
6:45:45 PM: ❯ Current directory
6:45:45 PM:   /opt/build/repo
6:45:45 PM: ​
6:45:45 PM: ❯ Config file
6:45:45 PM:   /opt/build/repo/netlify.toml
6:45:45 PM: ​
6:45:45 PM: ❯ Context
6:45:45 PM:   production
6:45:45 PM: ​
6:45:45 PM: ❯ Loading plugins
6:45:45 PM:    - @netlify/[email protected] from netlify.toml and package.json
6:45:46 PM: ​
6:45:46 PM: ────────────────────────────────────────────────────────────────
6:45:46 PM:   1. @netlify/plugin-nextjs (onPreBuild event)                  
6:45:46 PM: ────────────────────────────────────────────────────────────────
6:45:46 PM: ​
6:45:46 PM: No Next.js cache to restore.
6:45:46 PM: Netlify configuration property "build.environment.NEXT_PRIVATE_TARGET" value changed.
6:45:46 PM: ​
6:45:46 PM: (@netlify/plugin-nextjs onPreBuild completed in 25ms)
6:45:46 PM: ​
6:45:46 PM: ────────────────────────────────────────────────────────────────
6:45:46 PM:   2. build.command from netlify.toml                            
6:45:46 PM: ────────────────────────────────────────────────────────────────
6:45:46 PM: ​
6:45:46 PM: $ npm run build
6:45:47 PM: npm WARN config tmp This setting is no longer used.  npm stores temporary files in a special
6:45:47 PM: npm WARN config location in the cache, and they are managed by
6:45:47 PM: npm WARN config     [`cacache`](http://npm.im/cacache).
6:45:47 PM: > [email protected] build
6:45:47 PM: > next build
6:45:47 PM: warn  - No build cache found. Please configure build caching for faster rebuilds. Read more: https://nextjs.org/docs/messages/no-cache
6:45:47 PM: Browserslist: caniuse-lite is outdated. Please run:
6:45:47 PM:   npx browserslist@latest --update-db
6:45:47 PM:   Why you should do it regularly: https://github.com/browserslist/browserslist#browsers-data-updating
6:45:47 PM: info  - Checking validity of types...
6:46:20 PM: info  - Creating an optimized production build...
6:46:20 PM: Browserslist: caniuse-lite is outdated. Please run:
6:46:20 PM:   npx browserslist@latest --update-db
6:46:20 PM:   Why you should do it regularly: https://github.com/browserslist/browserslist#browsers-data-updating
6:46:23 PM: Browserslist: caniuse-lite is outdated. Please run:
6:46:23 PM: npx browserslist@latest --update-db
6:46:23 PM: Why you should do it regularly:
6:46:23 PM: https://github.com/browserslist/browserslist#browsers-data-updating
6:47:57 PM: info  - Compiled successfully
6:47:57 PM: info  - Collecting page data...
6:48:07 PM: info  - Generating static pages (0/15)
6:48:07 PM: info  - Generating static pages (3/15)
6:48:08 PM: info  - Generating static pages (7/15)
6:48:09 PM: info  - Generating static pages (11/15)
6:48:10 PM: info  - Generating static pages (15/15)
6:48:10 PM: info  - Finalizing page optimization...
6:48:10 PM: Page                                                                   Size     First Load JS
6:48:10 PM: ┌ λ /                                                                  12.5 kB         198 kB
6:48:10 PM: ├   /_app                                                              0 B             105 kB
6:48:10 PM: ├ ○ /404                                                               6.38 kB         119 kB
6:48:10 PM: ├ λ /account                                                           584 B           203 kB
6:48:10 PM: ├ λ /account/billing                                                   590 B           203 kB
6:48:10 PM: ├ λ /account/profile                                                   589 B           203 kB
6:48:10 PM: ├ λ /api/auth/[...nextauth]                                            0 B             105 kB
6:48:10 PM: ├ λ /api/auth/check/signin/[email]                                     0 B             105 kB
6:48:10 PM: ├ λ /api/blog/post/[slug]/view                                         0 B             105 kB
6:48:10 PM: ├ λ /api/profile                                                       0 B             105 kB
6:48:10 PM: ├ λ /api/sheet/[id]                                                    0 B             105 kB
6:48:10 PM: ├ λ /api/sheet/[id]/favorites/add                                      0 B             105 kB
6:48:10 PM: ├ λ /api/sheet/[id]/favorites/check                                    0 B             105 kB
6:48:10 PM: ├ λ /api/sheet/[id]/favorites/remove                                   0 B             105 kB
6:48:10 PM: ├ λ /api/sheet/[id]/save                                               0 B             105 kB
6:48:10 PM: ├ λ /api/sheet/[id]/view                                               0 B             105 kB
6:48:10 PM: ├ λ /api/sheet/list                                                    0 B             105 kB
6:48:10 PM: ├ λ /api/sheet/list/following                                          0 B             105 kB
6:48:10 PM: ├ λ /api/sheet/new                                                     0 B             105 kB
6:48:10 PM: ├ λ /api/sheet/request                                                 0 B             105 kB
6:48:10 PM: ├ λ /api/sheet/search/[searchQuery]                                    0 B             105 kB
6:48:10 PM: ├ λ /api/user/[userId]/follow                                          0 B             105 kB
6:48:10 PM: ├ λ /api/user/[userId]/is-following                                    0 B             105 kB
6:48:10 PM: ├ λ /api/user/[userId]/unfollow                                        0 B             105 kB
6:48:10 PM: ├ λ /api/username/[newUsername]                                        0 B             105 kB
6:48:10 PM: ├ λ /api/username/check/[username]                                     0 B             105 kB
6:48:10 PM: ├ ● /blog (722 ms)                                                     553 B           164 kB
6:48:10 PM: ├ ● /blog/category/[postCategory] (1178 ms)                            568 B           165 kB
6:48:10 PM: ├   ├ /blog/category/kalimba (777 ms)
6:48:10 PM: ├   └ /blog/category/tabwhale (401 ms)
6:48:10 PM: ├ ● /blog/post/[postSlug] (6466 ms)                                    3.08 kB         172 kB
6:48:10 PM: ├   ├ /blog/post/how-to-read-kalimba-tabs (2623 ms)
6:48:10 PM: ├   ├ /blog/post/how-to-read-number-and-letter-kalimba-tabs (2129 ms)
6:48:10 PM: ├   └ /blog/post/about-tabwhale (1714 ms)
6:48:10 PM: ├ λ /check-your-email                                                  1.32 kB         154 kB
6:48:10 PM: ├ λ /create-account                                                    3.65 kB         156 kB
6:48:10 PM: ├ ○ /demo (1731 ms)                                                    1.62 kB         554 kB
6:48:10 PM: ├ ○ /demo/edit (1331 ms)                                               1.62 kB         563 kB
6:48:10 PM: ├ ○ /embed/[sheetId] (365 ms)                                          5.51 kB         501 kB
6:48:10 PM: ├ λ /favorites                                                         595 B           205 kB
6:48:10 PM: ├ λ /login                                                             3.69 kB         156 kB
6:48:10 PM: ├ λ /print/[sheetId]                                                   4.31 kB         479 kB
6:48:10 PM: ├ ○ /privacy-policy (340 ms)                                           8.17 kB         150 kB
6:48:10 PM: ├ λ /profile                                                           592 B           205 kB
6:48:10 PM: ├ λ /profile/[username]/[[...initialTab]]                              626 B           205 kB
6:48:10 PM: ├ ● /tab/[title]/[id]                                                  786 B           553 kB
6:48:10 PM: ├ λ /tab/[title]/[id]/edit                                             789 B           563 kB
6:48:10 PM: ├ λ /tab/[title]/[id]/preview                                          790 B           553 kB
6:48:10 PM: ├ λ /tab/new                                                           14.4 kB         528 kB
6:48:10 PM: ├ ○ /terms-of-service (636 ms)                                         8.3 kB          150 kB
6:48:10 PM: ├ ● /tools (640 ms)                                                    3.31 kB         162 kB
6:48:10 PM: └ ● /tools/[toolSlug] (1494 ms)                                        14.7 kB         251 kB
6:48:10 PM:     └ /tools/virtual-piano (1494 ms)
6:48:10 PM: + First Load JS shared by all                                          105 kB
6:48:10 PM:   ├ chunks/framework-79bce4a3a540b080.js                               42.1 kB
6:48:10 PM:   ├ chunks/main-492fbff266beac1c.js                                    32.4 kB
6:48:10 PM:   ├ chunks/pages/_app-5899c68e7834e8cb.js                              28.8 kB
6:48:10 PM:   └ chunks/webpack-e492e30a01011fa4.js                                 1.59 kB
6:48:10 PM: λ  (Server)  server-side renders at runtime (uses getInitialProps or getServerSideProps)
6:48:10 PM: ○  (Static)  automatically rendered as static HTML (uses no initial props)
6:48:10 PM: ●  (SSG)     automatically generated as static HTML + JSON (uses getStaticProps)
6:48:10 PM: ​
6:48:10 PM: (build.command completed in 2m 23.8s)
6:48:10 PM: ​
6:48:10 PM: ────────────────────────────────────────────────────────────────
6:48:10 PM:   3. @netlify/plugin-nextjs (onBuild event)                     
6:48:10 PM: ────────────────────────────────────────────────────────────────
6:48:10 PM: ​
6:48:11 PM: NextAuth package detected, setting NEXTAUTH_URL environment variable to https://resilient-cranachan-3c07af.netlify.app
6:48:11 PM: Patching /opt/build/repo/node_modules/next/dist/server/base-server.js
6:48:11 PM: Done
6:48:11 PM: Patching /opt/build/repo/node_modules/next/dist/server/next-server.js
6:48:11 PM: Done
6:48:11 PM: Moving static page files to serve from CDN...
6:48:11 PM: Moved 20 files
6:48:11 PM: Netlify configuration property "redirects" value changed to [
6:48:11 PM:   { from: '/_next/static/*', to: '/static/:splat', status: 200 },
6:48:11 PM:   {
6:48:11 PM:     from: '/_next/image*',
6:48:11 PM:     query: { url: ':url', w: ':width', q: ':quality' },
6:48:11 PM:     to: '/_ipx/w_:width,q_:quality/:url',
6:48:11 PM:     status: 301
6:48:11 PM:   },
6:48:11 PM:   { from: '/_ipx/*', to: '/.netlify/builders/_ipx', status: 200 },
6:48:11 PM:   { from: '/cache/*', to: '/404.html', status: 404, force: true },
6:48:11 PM:   { from: '/server/*', to: '/404.html', status: 404, force: true },
6:48:11 PM:   { from: '/serverless/*', to: '/404.html', status: 404, force: true },
6:48:11 PM:   { from: '/trace', to: '/404.html', status: 404, force: true },
6:48:11 PM:   { from: '/traces', to: '/404.html', status: 404, force: true },
6:48:11 PM:   {
6:48:11 PM:     from: '/routes-manifest.json',
6:48:11 PM:     to: '/404.html',
6:48:11 PM:     status: 404,
6:48:11 PM:     force: true
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/build-manifest.json',
6:48:11 PM:     to: '/404.html',
6:48:11 PM:     status: 404,
6:48:11 PM:     force: true
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/prerender-manifest.json',
6:48:11 PM:     to: '/404.html',
6:48:11 PM:     status: 404,
6:48:11 PM:     force: true
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/react-loadable-manifest.json',
6:48:11 PM:     to: '/404.html',
6:48:11 PM:     status: 404,
6:48:11 PM:     force: true
6:48:11 PM:   },
6:48:11 PM:   { from: '/BUILD_ID', to: '/404.html', status: 404, force: true },
6:48:11 PM:   {
6:48:11 PM:     from: '/api',
6:48:11 PM:     to: '/.netlify/functions/___netlify-handler',
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/api/*',
6:48:11 PM:     to: '/.netlify/functions/___netlify-handler',
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/ads.txt',
6:48:11 PM:     to: '/ads.txt',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/android-chrome-192x192.png',
6:48:11 PM:     to: '/android-chrome-192x192.png',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/android-chrome-512x512.png',
6:48:11 PM:     to: '/android-chrome-512x512.png',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/apple-touch-icon.png',
6:48:11 PM:     to: '/apple-touch-icon.png',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/browserconfig.xml',
6:48:11 PM:     to: '/browserconfig.xml',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/favicon-16x16.png',
6:48:11 PM:     to: '/favicon-16x16.png',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/favicon-32x32.png',
6:48:11 PM:     to: '/favicon-32x32.png',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/favicon.ico',
6:48:11 PM:     to: '/favicon.ico',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/logo.png',
6:48:11 PM:     to: '/logo.png',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/mstile-144x144.png',
6:48:11 PM:     to: '/mstile-144x144.png',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/mstile-150x150.png',
6:48:11 PM:     to: '/mstile-150x150.png',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/mstile-310x150.png',
6:48:11 PM:     to: '/mstile-310x150.png',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/mstile-310x310.png',
6:48:11 PM:     to: '/mstile-310x310.png',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/mstile-70x70.png',
6:48:11 PM:     to: '/mstile-70x70.png',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/robots.txt',
6:48:11 PM:     to: '/robots.txt',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/safari-pinned-tab.svg',
6:48:11 PM:     to: '/safari-pinned-tab.svg',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/share.png',
6:48:11 PM:     to: '/share.png',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/site.webmanifest',
6:48:11 PM:     to: '/site.webmanifest',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/add-dots.mp4',
6:48:11 PM:     to: '/videos/add-dots.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/add-harmony-note.mp4',
6:48:11 PM:     to: '/videos/add-harmony-note.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/add-measure-after.mp4',
6:48:11 PM:     to: '/videos/add-measure-after.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/add-measure-before.mp4',
6:48:11 PM:     to: '/videos/add-measure-before.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/add-measure-to-end.mp4',
6:48:11 PM:     to: '/videos/add-measure-to-end.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/add-melody-note.mp4',
6:48:11 PM:     to: '/videos/add-melody-note.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/add-note.mp4',
6:48:11 PM:     to: '/videos/add-note.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/add-tie.mp4',
6:48:11 PM:     to: '/videos/add-tie.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/change-cursor.mp4',
6:48:11 PM:     to: '/videos/change-cursor.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/change-duration-insert-note.mp4',
6:48:11 PM:     to: '/videos/change-duration-insert-note.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/change-duration-mode-insert-note.mp4',
6:48:11 PM:     to: '/videos/change-duration-mode-insert-note.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/change-duration-mode-replace-note.mp4',
6:48:11 PM:     to: '/videos/change-duration-mode-replace-note.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/change-tempo.mp4',
6:48:11 PM:     to: '/videos/change-tempo.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/change-time-signature.mp4',
6:48:11 PM:     to: '/videos/change-time-signature.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/change-tine-color.mp4',
6:48:11 PM:     to: '/videos/change-tine-color.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/delete-dots.mp4',
6:48:11 PM:     to: '/videos/delete-dots.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/delete-measure.mp4',
6:48:11 PM:     to: '/videos/delete-measure.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/delete-note.mp4',
6:48:11 PM:     to: '/videos/delete-note.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/delete-rest.mp4',
6:48:11 PM:     to: '/videos/delete-rest.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/delete-tie.mp4',
6:48:11 PM:     to: '/videos/delete-tie.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/help.mp4',
6:48:11 PM:     to: '/videos/help.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/insert-note.mp4',
6:48:11 PM:     to: '/videos/insert-note.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/insert-rest.mp4',
6:48:11 PM:     to: '/videos/insert-rest.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/lyric.mp4',
6:48:11 PM:     to: '/videos/lyric.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/preview-tab.mp4',
6:48:11 PM:     to: '/videos/preview-tab.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/publish-tab.mp4',
6:48:11 PM:     to: '/videos/publish-tab.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/repeat.mp4',
6:48:11 PM:     to: '/videos/repeat.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/save-tab.mp4',
6:48:11 PM:     to: '/videos/save-tab.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/section-name.mp4',
6:48:11 PM:     to: '/videos/section-name.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/undo-redo.mp4',
6:48:11 PM:     to: '/videos/undo-redo.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/videos/unpublish-tab.mp4',
6:48:11 PM:     to: '/videos/unpublish-tab.mp4',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/clean-guitar/clean-guitar-A2.mp3',
6:48:11 PM:     to: '/sound/clean-guitar/clean-guitar-A2.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/clean-guitar/clean-guitar-A4.mp3',
6:48:11 PM:     to: '/sound/clean-guitar/clean-guitar-A4.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/clean-guitar/clean-guitar-B3.mp3',
6:48:11 PM:     to: '/sound/clean-guitar/clean-guitar-B3.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/clean-guitar/clean-guitar-B5.mp3',
6:48:11 PM:     to: '/sound/clean-guitar/clean-guitar-B5.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/clean-guitar/clean-guitar-D3.mp3',
6:48:11 PM:     to: '/sound/clean-guitar/clean-guitar-D3.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/clean-guitar/clean-guitar-D5.mp3',
6:48:11 PM:     to: '/sound/clean-guitar/clean-guitar-D5.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/clean-guitar/clean-guitar-E2.mp3',
6:48:11 PM:     to: '/sound/clean-guitar/clean-guitar-E2.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/clean-guitar/clean-guitar-E4.mp3',
6:48:11 PM:     to: '/sound/clean-guitar/clean-guitar-E4.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/clean-guitar/clean-guitar-G3.mp3',
6:48:11 PM:     to: '/sound/clean-guitar/clean-guitar-G3.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/clean-guitar/clean-guitar-G5.mp3',
6:48:11 PM:     to: '/sound/clean-guitar/clean-guitar-G5.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/guitar/guitar-A2.mp3',
6:48:11 PM:     to: '/sound/guitar/guitar-A2.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/guitar/guitar-A4.mp3',
6:48:11 PM:     to: '/sound/guitar/guitar-A4.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/guitar/guitar-B3.mp3',
6:48:11 PM:     to: '/sound/guitar/guitar-B3.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/guitar/guitar-B5.mp3',
6:48:11 PM:     to: '/sound/guitar/guitar-B5.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/guitar/guitar-D3.mp3',
6:48:11 PM:     to: '/sound/guitar/guitar-D3.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/guitar/guitar-D5.mp3',
6:48:11 PM:     to: '/sound/guitar/guitar-D5.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/guitar/guitar-E2.mp3',
6:48:11 PM:     to: '/sound/guitar/guitar-E2.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/guitar/guitar-E4.mp3',
6:48:11 PM:     to: '/sound/guitar/guitar-E4.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/guitar/guitar-G3.mp3',
6:48:11 PM:     to: '/sound/guitar/guitar-G3.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/guitar/guitar-G5.mp3',
6:48:11 PM:     to: '/sound/guitar/guitar-G5.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/kalimba/gecko-k17k-C3.mp3',
6:48:11 PM:     to: '/sound/kalimba/gecko-k17k-C3.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/kalimba/hluru-black-walnut-F2.mp3',
6:48:11 PM:     to: '/sound/kalimba/hluru-black-walnut-F2.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/ocarina/ocarina-E4.mp3',
6:48:11 PM:     to: '/sound/ocarina/ocarina-E4.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/piano/piano-C1.mp3',
6:48:11 PM:     to: '/sound/piano/piano-C1.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/piano/piano-C2.mp3',
6:48:11 PM:     to: '/sound/piano/piano-C2.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/piano/piano-C3.mp3',
6:48:11 PM:     to: '/sound/piano/piano-C3.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/piano/piano-C4.mp3',
6:48:11 PM:     to: '/sound/piano/piano-C4.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/piano/piano-C5.mp3',
6:48:11 PM:     to: '/sound/piano/piano-C5.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/piano/piano-C6.mp3',
6:48:11 PM:     to: '/sound/piano/piano-C6.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/piano/piano-C7.mp3',
6:48:11 PM:     to: '/sound/piano/piano-C7.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/piano/piano-C8.mp3',
6:48:11 PM:     to: '/sound/piano/piano-C8.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/piano/piano-Gb1.mp3',
6:48:11 PM:     to: '/sound/piano/piano-Gb1.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/piano/piano-Gb2.mp3',
6:48:11 PM:     to: '/sound/piano/piano-Gb2.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/piano/piano-Gb3.mp3',
6:48:11 PM:     to: '/sound/piano/piano-Gb3.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/piano/piano-Gb4.mp3',
6:48:11 PM:     to: '/sound/piano/piano-Gb4.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   {
6:48:11 PM:     from: '/sound/piano/piano-Gb5.mp3',
6:48:11 PM:     to: '/sound/piano/piano-Gb5.mp3',
6:48:11 PM:     conditions: { Cookie: [Array] },
6:48:11 PM:     status: 200
6:48:11 PM:   },
6:48:11 PM:   ... 80 more items
6:48:11 PM: ].
6:48:11 PM: ​
6:48:11 PM: (@netlify/plugin-nextjs onBuild completed in 675ms)
6:48:11 PM: ​
6:48:11 PM: ────────────────────────────────────────────────────────────────
6:48:11 PM:   4. Functions bundling                                         
6:48:11 PM: ────────────────────────────────────────────────────────────────
6:48:11 PM: ​
6:48:11 PM: Packaging Functions from .netlify/functions-internal directory:
6:48:11 PM:  - ___netlify-handler/___netlify-handler.js
6:48:11 PM:  - ___netlify-odb-handler/___netlify-odb-handler.js
6:48:11 PM:  - _ipx/_ipx.js
6:48:11 PM: ​
6:49:07 PM: ​
6:49:07 PM: (Functions bundling completed in 55.8s)
6:49:07 PM: ​
6:49:07 PM: ────────────────────────────────────────────────────────────────
6:49:07 PM:   5. @netlify/plugin-nextjs (onPostBuild event)                 
6:49:07 PM: ────────────────────────────────────────────────────────────────
6:49:07 PM: ​
6:49:07 PM: Next.js cache saved.
6:49:07 PM: Netlify configuration property "headers" value changed to [
6:49:07 PM:   {
6:49:07 PM:     for: '/(.*)',
6:49:07 PM:     values: {
6:49:07 PM:       'X-DNS-Prefetch-Control': 'on',
6:49:07 PM:       'Strict-Transport-Security': 'max-age=63072000; includeSubDomains; preload',
6:49:07 PM:       'X-XSS-Protection': '1; mode=block',
6:49:07 PM:       'X-Frame-Options': 'SAMEORIGIN',
6:49:07 PM:       'Permissions-Policy': '',
6:49:07 PM:       'X-Content-Type-Options': 'nosniff'
6:49:07 PM:     }
6:49:07 PM:   }
6:49:07 PM: ].
6:49:07 PM: ​
6:49:07 PM: (@netlify/plugin-nextjs onPostBuild completed in 882ms)
6:49:07 PM: ​
6:49:07 PM: ────────────────────────────────────────────────────────────────
6:49:07 PM:   6. Deploy site                                                
6:49:07 PM: ────────────────────────────────────────────────────────────────
6:49:07 PM: ​
6:49:08 PM: Starting to deploy site from '.next'
6:49:08 PM: Creating deploy tree 
6:49:08 PM: Creating deploy upload records
6:49:09 PM: 62 new files to upload
6:49:09 PM: 3 new functions to upload
6:49:20 PM: Site deploy was successfully initiated
6:49:20 PM: ​
6:49:20 PM: (Deploy site completed in 12.1s)
6:49:20 PM: ​
6:49:20 PM: ────────────────────────────────────────────────────────────────
6:49:20 PM:   Netlify Build Complete                                        
6:49:20 PM: ────────────────────────────────────────────────────────────────
6:49:20 PM: ​
6:49:20 PM: (Netlify Build completed in 3m 35s)
6:49:20 PM: Starting post processing
6:49:20 PM: Caching artifacts
6:49:20 PM: Started saving node modules
6:49:20 PM: Finished saving node modules
6:49:20 PM: Started saving build plugins
6:49:20 PM: Finished saving build plugins
6:49:20 PM: Started saving pip cache
6:49:20 PM: Finished saving pip cache
6:49:20 PM: Started saving emacs cask dependencies
6:49:20 PM: Finished saving emacs cask dependencies
6:49:20 PM: Started saving maven dependencies
6:49:20 PM: Finished saving maven dependencies
6:49:20 PM: Started saving boot dependencies
6:49:20 PM: Finished saving boot dependencies
6:49:20 PM: Started saving rust rustup cache
6:49:20 PM: Finished saving rust rustup cache
6:49:20 PM: Started saving go dependencies
6:49:20 PM: Finished saving go dependencies
6:49:20 PM: Skipping HTML post processing
6:49:21 PM: Post processing - header rules
6:49:21 PM: Post processing - redirect rules
6:49:21 PM: Post processing done
6:49:21 PM: Build script success
6:49:25 PM: Site is live ✨
6:50:22 PM: Finished processing build request in 6m8.875748926s

Function logs

Function logs
7:03:53 PM 2022-06-28T22:03:53.777Z	undefined	ERROR	Uncaught Exception 	{"errorType":"TypeError","errorMessage":"Invalid URL: http://","code":"ERR_INVALID_URL","input":"http://","stack":["TypeError [ERR_INVALID_URL]: Invalid URL: http://","    at new NodeError (internal/errors.js:322:7)","    at onParseError (internal/url.js:270:9)","    at new URL (internal/url.js:346:5)","    at /var/task/node_modules/ipx/dist/chunks/middleware.cjs:131:12","    at Array.map (<anonymous>)","    at createHTTPSource (/var/task/node_modules/ipx/dist/chunks/middleware.cjs:127:28)","    at createIPX (/var/task/node_modules/ipx/dist/chunks/middleware.cjs:423:24)","    at createIPXHandler (/var/task/node_modules/@netlify/ipx/dist/index.js:16:37)","    at Object.<anonymous> (/var/task/.netlify/functions-internal/_ipx/_ipx.js:7:46)","    at Module._compile (internal/modules/cjs/loader.js:1085:14)"]}

.next JSON files

generated .next JSON files

required-server-files.json

{
  "version": 1,
  "config": {
    "env": {
      "NEXTAUTH_URL": "https://resilient-cranachan-3c07af.netlify.app"
    },
    "webpackDevMiddleware": null,
    "eslint": {
      "ignoreDuringBuilds": false
    },
    "typescript": {
      "ignoreBuildErrors": false,
      "tsconfigPath": "tsconfig.json"
    },
    "distDir": ".next",
    "cleanDistDir": true,
    "assetPrefix": "",
    "configOrigin": "next.config.js",
    "useFileSystemPublicRoutes": true,
    "generateEtags": true,
    "pageExtensions": [
      "tsx",
      "ts",
      "jsx",
      "js"
    ],
    "target": "server",
    "poweredByHeader": true,
    "compress": true,
    "analyticsId": "",
    "images": {
      "deviceSizes": [
        640,
        750,
        828,
        1080,
        1200,
        1920,
        2048,
        3840
      ],
      "imageSizes": [
        16,
        32,
        48,
        64,
        96,
        128,
        256,
        384
      ],
      "path": "/_next/image",
      "loader": "default",
      "domains": [
        "content.tabwhale.com.s3.amazonaws.com",
        "content.tabwhale.com.s3.us-east-2.amazonaws.com",
        "content.tabwhale.com",
        ""
      ],
      "disableStaticImages": false,
      "minimumCacheTTL": 60,
      "formats": [
        "image/webp"
      ],
      "dangerouslyAllowSVG": false,
      "contentSecurityPolicy": "script-src 'none'; frame-src 'none'; sandbox;"
    },
    "devIndicators": {
      "buildActivity": true,
      "buildActivityPosition": "bottom-right"
    },
    "onDemandEntries": {
      "maxInactiveAge": 15000,
      "pagesBufferLength": 2
    },
    "amp": {
      "canonicalBase": ""
    },
    "basePath": "",
    "sassOptions": {},
    "trailingSlash": false,
    "i18n": null,
    "productionBrowserSourceMaps": false,
    "optimizeFonts": true,
    "excludeDefaultMomentLocales": true,
    "serverRuntimeConfig": {},
    "publicRuntimeConfig": {
      "nextPlausibleProxyOptions": {
        "customDomain": "https://ec2-18-117-11-139.us-east-2.compute.amazonaws.com"
      }
    },
    "reactStrictMode": true,
    "httpAgentOptions": {
      "keepAlive": true
    },
    "outputFileTracing": true,
    "staticPageGenerationTimeout": 60,
    "swcMinify": false,
    "experimental": {
      "cpus": 7,
      "sharedPool": true,
      "plugins": false,
      "profiling": false,
      "isrFlushToDisk": true,
      "workerThreads": false,
      "pageEnv": false,
      "optimizeCss": false,
      "nextScriptWorkers": false,
      "scrollRestoration": false,
      "externalDir": false,
      "reactRoot": false,
      "disableOptimizedLoading": false,
      "gzipSize": true,
      "swcFileReading": true,
      "craCompat": false,
      "esmExternals": true,
      "isrMemoryCacheSize": 52428800,
      "serverComponents": false,
      "fullySpecified": false,
      "outputFileTracingRoot": "",
      "outputStandalone": false,
      "images": {
        "layoutRaw": false
      },
      "trustHostHeader": false
    },
    "configFileName": "next.config.js",
    "compiler": {
      "styledComponents": true
    }
  },
  "appDir": "/opt/build/repo",
  "files": [
    ".next/routes-manifest.json",
    ".next/server/pages-manifest.json",
    ".next/build-manifest.json",
    ".next/prerender-manifest.json",
    ".next/server/middleware-manifest.json",
    ".next/react-loadable-manifest.json",
    ".next/server/font-manifest.json",
    ".next/BUILD_ID"
  ],
  "ignore": [
    "node_modules/next/dist/compiled/@ampproject/toolbox-optimizer/**/*"
  ]
}

prerender-manifest.json

{
  "version": 3,
  "routes": {
    "/tools": {
      "initialRevalidateSeconds": false,
      "srcRoute": null,
      "dataRoute": "/_next/data/HYCdsj7jwnTRMUSAb8-lZ/tools.json"
    },
    "/blog/post/about-tabwhale": {
      "initialRevalidateSeconds": false,
      "srcRoute": "/blog/post/[postSlug]",
      "dataRoute": "/_next/data/HYCdsj7jwnTRMUSAb8-lZ/blog/post/about-tabwhale.json"
    },
    "/blog/post/how-to-read-kalimba-tabs": {
      "initialRevalidateSeconds": false,
      "srcRoute": "/blog/post/[postSlug]",
      "dataRoute": "/_next/data/HYCdsj7jwnTRMUSAb8-lZ/blog/post/how-to-read-kalimba-tabs.json"
    },
    "/blog/post/how-to-read-number-and-letter-kalimba-tabs": {
      "initialRevalidateSeconds": false,
      "srcRoute": "/blog/post/[postSlug]",
      "dataRoute": "/_next/data/HYCdsj7jwnTRMUSAb8-lZ/blog/post/how-to-read-number-and-letter-kalimba-tabs.json"
    },
    "/blog": {
      "initialRevalidateSeconds": false,
      "srcRoute": null,
      "dataRoute": "/_next/data/HYCdsj7jwnTRMUSAb8-lZ/blog.json"
    },
    "/blog/category/kalimba": {
      "initialRevalidateSeconds": false,
      "srcRoute": "/blog/category/[postCategory]",
      "dataRoute": "/_next/data/HYCdsj7jwnTRMUSAb8-lZ/blog/category/kalimba.json"
    },
    "/blog/category/tabwhale": {
      "initialRevalidateSeconds": false,
      "srcRoute": "/blog/category/[postCategory]",
      "dataRoute": "/_next/data/HYCdsj7jwnTRMUSAb8-lZ/blog/category/tabwhale.json"
    },
    "/tools/virtual-piano": {
      "initialRevalidateSeconds": false,
      "srcRoute": "/tools/[toolSlug]",
      "dataRoute": "/_next/data/HYCdsj7jwnTRMUSAb8-lZ/tools/virtual-piano.json"
    }
  },
  "dynamicRoutes": {
    "/blog/post/[postSlug]": {
      "routeRegex": "^/blog/post/([^/]+?)(?:/)?$",
      "dataRoute": "/_next/data/HYCdsj7jwnTRMUSAb8-lZ/blog/post/[postSlug].json",
      "fallback": false,
      "dataRouteRegex": "^/_next/data/HYCdsj7jwnTRMUSAb8\\-lZ/blog/post/([^/]+?)\\.json$"
    },
    "/blog/category/[postCategory]": {
      "routeRegex": "^/blog/category/([^/]+?)(?:/)?$",
      "dataRoute": "/_next/data/HYCdsj7jwnTRMUSAb8-lZ/blog/category/[postCategory].json",
      "fallback": false,
      "dataRouteRegex": "^/_next/data/HYCdsj7jwnTRMUSAb8\\-lZ/blog/category/([^/]+?)\\.json$"
    },
    "/tools/[toolSlug]": {
      "routeRegex": "^/tools/([^/]+?)(?:/)?$",
      "dataRoute": "/_next/data/HYCdsj7jwnTRMUSAb8-lZ/tools/[toolSlug].json",
      "fallback": false,
      "dataRouteRegex": "^/_next/data/HYCdsj7jwnTRMUSAb8\\-lZ/tools/([^/]+?)\\.json$"
    },
    "/tab/[title]/[id]": {
      "routeRegex": "^/tab/([^/]+?)/([^/]+?)(?:/)?$",
      "dataRoute": "/_next/data/HYCdsj7jwnTRMUSAb8-lZ/tab/[title]/[id].json",
      "fallback": null,
      "dataRouteRegex": "^/_next/data/HYCdsj7jwnTRMUSAb8\\-lZ/tab/([^/]+?)/([^/]+?)\\.json$"
    }
  },
  "notFoundRoutes": [],
  "preview": {
    "previewModeId": "---",
    "previewModeSigningKey": "---",
    "previewModeEncryptionKey": "---"
  }
}

brunocalou avatar Jun 28 '22 22:06 brunocalou

Hi! I'm looking to replicate this - can you give me the format of your process.env.S3_UPLOAD_BUCKET. Does it include the http:// or https://, or is it just a variable like bucketname?

sarahetter avatar Jul 07 '22 14:07 sarahetter

Hi! I'm looking to replicate this - can you give me the format of your process.env.S3_UPLOAD_BUCKET. Does it include the http:// or https://, or is it just a variable like bucketname?

Hello!

Sure, it's defined as S3_UPLOAD_BUCKET=content.tabwhale.com, and the region is S3_UPLOAD_REGION=us-east-2

brunocalou avatar Jul 07 '22 18:07 brunocalou

Hi. Can you confirm whether this issue is still present?

ascorbic avatar Dec 20 '22 11:12 ascorbic

Closing as we have not received a response. If this is still an issue, please re-open.

sarahetter avatar Jan 03 '23 16:01 sarahetter

For anybody finding this issue while Googling, I had the same problem. The problem came down to Netlify not liking an empty string provided in next.config.js's images: { domains: [...] } list. The image below shows the line from OP's next config that was causing the issue on Netlify. image We removed the empty string and no longer receive the error. I hope this helps whoever finds this issue as well.

ui-jb avatar Apr 18 '24 20:04 ui-jb