Skip to content

Commit 1ca59e3

Browse files
fix: redirect respects rewrites (#5315)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
1 parent 2d453a2 commit 1ca59e3

7 files changed

Lines changed: 33 additions & 24 deletions

File tree

examples/react/basic-ssr-file-based/src/entry-server.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export async function render({
1818
res: express.Response
1919
}) {
2020
// Convert the express request to a fetch request
21-
const url = new URL(req.originalUrl || req.url, 'https://localhost:3000').href
21+
const url = new URL(req.originalUrl || req.url, 'http://localhost:3000').href
2222

2323
const request = new Request(url, {
2424
method: req.method,

examples/react/basic-ssr-streaming-file-based/src/entry-server.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export async function render({
1818
res: express.Response
1919
}) {
2020
// Convert the express request to a fetch request
21-
const url = new URL(req.originalUrl || req.url, 'https://localhost:3000').href
21+
const url = new URL(req.originalUrl || req.url, 'http://localhost:3000').href
2222

2323
const request = new Request(url, {
2424
method: req.method,

packages/router-core/src/router.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2230,7 +2230,11 @@ export class RouterCore<
22302230

22312231
resolveRedirect = (redirect: AnyRedirect): AnyRedirect => {
22322232
if (!redirect.options.href) {
2233-
redirect.options.href = this.buildLocation(redirect.options).href
2233+
let href = this.buildLocation(redirect.options).url
2234+
if (this.origin && href.startsWith(this.origin)) {
2235+
href = href.replace(this.origin, '') || '/'
2236+
}
2237+
redirect.options.href = href
22342238
redirect.headers.set('Location', redirect.options.href)
22352239
}
22362240

packages/router-core/src/ssr/createRequestHandler.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { createMemoryHistory } from '@tanstack/history'
22
import { mergeHeaders } from './headers'
3-
import { attachRouterServerSsrUtils } from './ssr-server'
3+
import { attachRouterServerSsrUtils, getOrigin } from './ssr-server'
44
import type { HandlerCallback } from './handlerCallback'
55
import type { AnyRouter } from '../router'
66
import type { Manifest } from '../manifest'
@@ -27,7 +27,7 @@ export function createRequestHandler<TRouter extends AnyRouter>({
2727
})
2828

2929
const url = new URL(request.url, 'http://localhost')
30-
30+
const origin = getOrigin(request)
3131
const href = url.href.replace(url.origin, '')
3232

3333
// Create a history for the router
@@ -38,6 +38,7 @@ export function createRequestHandler<TRouter extends AnyRouter>({
3838
// Update the router with the history and context
3939
router.update({
4040
history,
41+
origin: router.options.origin ?? origin,
4142
})
4243

4344
await router.load()

packages/router-core/src/ssr/server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export {
77
transformStreamWithRouter,
88
transformReadableStreamWithRouter,
99
} from './transformStreamWithRouter'
10-
export { attachRouterServerSsrUtils } from './ssr-server'
10+
export { attachRouterServerSsrUtils, getOrigin } from './ssr-server'
1111

1212
// declare module '../router' {
1313
// export interface RegisterSsr {

packages/router-core/src/ssr/ssr-server.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,3 +141,17 @@ export function attachRouterServerSsrUtils({
141141
},
142142
}
143143
}
144+
145+
export function getOrigin(request: Request) {
146+
const originHeader = request.headers.get('Origin')
147+
if (originHeader) {
148+
try {
149+
new URL(originHeader)
150+
return originHeader
151+
} catch {}
152+
}
153+
try {
154+
return new URL(request.url).origin
155+
} catch {}
156+
return 'http://localhost'
157+
}

packages/start-server-core/src/createStartHandler.ts

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ import {
1111
joinPaths,
1212
trimPath,
1313
} from '@tanstack/router-core'
14-
import { attachRouterServerSsrUtils } from '@tanstack/router-core/ssr/server'
14+
import {
15+
attachRouterServerSsrUtils,
16+
getOrigin,
17+
} from '@tanstack/router-core/ssr/server'
1518
import { runWithStartContext } from '@tanstack/start-storage-context'
1619
import { getResponseHeaders, requestHandler } from './request-response'
1720
import { getStartManifest } from './router-manifest'
@@ -94,19 +97,7 @@ export function createStartHandler<TRegister = Register>(
9497
request,
9598
requestOpts,
9699
) => {
97-
function getOrigin() {
98-
const originHeader = request.headers.get('Origin')
99-
if (originHeader) {
100-
try {
101-
new URL(originHeader)
102-
return originHeader
103-
} catch {}
104-
}
105-
try {
106-
return new URL(request.url).origin
107-
} catch {}
108-
return 'http://localhost'
109-
}
100+
const origin = getOrigin(request)
110101

111102
// Patching fetch function to use our request resolver
112103
// if the input starts with `/` which is a common pattern for
@@ -121,7 +112,7 @@ export function createStartHandler<TRegister = Register>(
121112

122113
if (typeof input === 'string' && input.startsWith('/')) {
123114
// e.g: fetch('/api/data')
124-
const url = new URL(input, getOrigin())
115+
const url = new URL(input, origin)
125116
return resolve(url, init)
126117
} else if (
127118
typeof input === 'object' &&
@@ -130,7 +121,7 @@ export function createStartHandler<TRegister = Register>(
130121
input.url.startsWith('/')
131122
) {
132123
// e.g: fetch(new Request('/api/data'))
133-
const url = new URL(input.url, getOrigin())
124+
const url = new URL(input.url, origin)
134125
return resolve(url, init)
135126
}
136127

@@ -163,12 +154,11 @@ export function createStartHandler<TRegister = Register>(
163154
initialEntries: [href],
164155
})
165156

166-
const origin = router.options.origin ?? getOrigin()
167157
router.update({
168158
history,
169159
isShell,
170160
isPrerendering,
171-
origin,
161+
origin: router.options.origin ?? origin,
172162
...{
173163
defaultSsr: startOptions.defaultSsr,
174164
serializationAdapters: startOptions.serializationAdapters,

0 commit comments

Comments
 (0)