Skip to content

Commit

Permalink
Fix next/image 404 when basePath and trailingSlash defined (#44312
Browse files Browse the repository at this point in the history
)

- Fixes #36681
  • Loading branch information
styfle committed Dec 23, 2022
1 parent f0aa10b commit b0a1e99
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 4 deletions.
8 changes: 4 additions & 4 deletions packages/next/server/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,10 @@ function assignDefaults(dir: string, userConfig: { [key: string]: any }) {
)
}

if (images.path === imageConfigDefault.path && result.basePath) {
images.path = `${result.basePath}${images.path}`
}

// Append trailing slash for non-default loaders and when trailingSlash is set
if (images.path) {
if (
Expand All @@ -458,10 +462,6 @@ function assignDefaults(dir: string, userConfig: { [key: string]: any }) {
}
}

if (images.path === imageConfigDefault.path && result.basePath) {
images.path = `${result.basePath}${images.path}`
}

if (images.loaderFile) {
if (images.loader !== 'default' && images.loader !== 'custom') {
throw new Error(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module.exports = {
basePath: '/prefix',
trailingSlash: true,
images: {
deviceSizes: [640, 828],
},
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import React from 'react'
import Image from 'next/image'
import img from '../public/test.jpg'

const Page = () => {
return (
<div>
<p>Trailing Slash</p>
<Image id="import-img" alt="import-img" src={img} priority />
<br />
<Image
id="string-img"
alt="string-img"
src="/prefix/test.jpg"
width={200}
height={200}
/>
</div>
)
}

export default Page
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/* eslint-env jest */

import {
fetchViaHTTP,
findPort,
killApp,
launchApp,
nextBuild,
nextStart,
} from 'next-test-utils'
import webdriver from 'next-webdriver'
import { join } from 'path'

const appDir = join(__dirname, '../')

let appPort
let app

const runTests = () => {
it('should correctly load image src from import', async () => {
expect.assertions(3)
const browser = await webdriver(appPort, '/prefix/')
const img = await browser.elementById('import-img')
const src = await img.getAttribute('src')
expect(src).toBe(
'/prefix/_next/image/?url=%2Fprefix%2F_next%2Fstatic%2Fmedia%2Ftest.fab2915d.jpg&w=828&q=75'
)
const res = await fetchViaHTTP(appPort, src)
expect(res.status).toBe(200)
expect(res.headers.get('content-type')).toBe('image/jpeg')
})
it('should correctly load image src from string', async () => {
expect.assertions(3)
const browser = await webdriver(appPort, '/prefix/')
const img = await browser.elementById('string-img')
const src = await img.getAttribute('src')
expect(src).toBe('/prefix/_next/image/?url=%2Fprefix%2Ftest.jpg&w=640&q=75')
const res = await fetchViaHTTP(appPort, src)
expect(res.status).toBe(200)
expect(res.headers.get('content-type')).toBe('image/jpeg')
})
}

describe('Image Component basePath + trailingSlash Tests', () => {
describe('dev mode', () => {
beforeAll(async () => {
appPort = await findPort()
app = await launchApp(appDir, appPort)
})
afterAll(() => killApp(app))

runTests()
})

describe('server mode', () => {
beforeAll(async () => {
await nextBuild(appDir)
appPort = await findPort()
app = await nextStart(appDir, appPort)
})
afterAll(() => killApp(app))

runTests()
})
})

0 comments on commit b0a1e99

Please sign in to comment.