# Source: https://nextjs.org/docs/pages/api-reference/file-conventions/proxy.md

# Source: https://nextjs.org/docs/app/api-reference/file-conventions/proxy.md

# Source: https://nextjs.org/docs/app/getting-started/proxy.md

# Source: https://nextjs.org/docs/pages/api-reference/file-conventions/proxy.md

# Source: https://nextjs.org/docs/app/api-reference/file-conventions/proxy.md

# Source: https://nextjs.org/docs/app/getting-started/proxy.md

# Source: https://nextjs.org/docs/pages/api-reference/file-conventions/proxy.md

# Source: https://nextjs.org/docs/app/api-reference/file-conventions/proxy.md

# Source: https://nextjs.org/docs/app/getting-started/proxy.md

# Source: https://nextjs.org/docs/app/api-reference/file-conventions/proxy.md

# Source: https://nextjs.org/docs/app/getting-started/proxy.md

# Source: https://nextjs.org/docs/pages/api-reference/file-conventions/proxy.md

# Source: https://nextjs.org/docs/app/api-reference/file-conventions/proxy.md

# Source: https://nextjs.org/docs/app/getting-started/proxy.md

# Source: https://nextjs.org/docs/pages/api-reference/file-conventions/proxy.md

# Source: https://nextjs.org/docs/app/api-reference/file-conventions/proxy.md

# Source: https://nextjs.org/docs/app/getting-started/proxy.md

# Proxy
@doc-version: 16.0.4


## Proxy

> **Good to know**: Starting with Next.js 16, Middleware is now called Proxy to better reflect its purpose. The functionality remains the same.

Proxy allows you to run code before a request is completed. Then, based on the incoming request, you can modify the response by rewriting, redirecting, modifying the request or response headers, or responding directly.

### Use cases

Some common scenarios where Proxy is effective include:

* Modifying headers for all pages or a subset of pages
* Rewriting to different pages based on A/B tests or experiments
* Programmatic redirects based on incoming request properties

For simple redirects, consider using the [`redirects`](/docs/app/api-reference/config/next-config-js/redirects.md) configuration in `next.config.ts` first. Proxy should be used when you need access to request data or more complex logic.

Proxy is *not* intended for slow data fetching. While Proxy can be helpful for [optimistic checks](/docs/app/guides/authentication.md#optimistic-checks-with-proxy-optional) such as permission-based redirects, it should not be used as a full session management or authorization solution.

Using fetch with `options.cache`, `options.next.revalidate`, or `options.next.tags`, has no effect in Proxy.

### Convention

Create a `proxy.ts` (or `.js`) file in the project root, or inside `src` if applicable, so that it is located at the same level as `pages` or `app`.

> **Note**: While only one `proxy.ts` file is supported per project, you can still organize your proxy logic into modules. Break out proxy functionalities into separate `.ts` or `.js` files and import them into your main `proxy.ts` file. This allows for cleaner management of route-specific proxy, aggregated in the `proxy.ts` for centralized control. By enforcing a single proxy file, it simplifies configuration, prevents potential conflicts, and optimizes performance by avoiding multiple proxy layers.

### Example

You can export your proxy function as either a default export or a named `proxy` export:

```ts filename="proxy.ts" switcher
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

// This function can be marked `async` if using `await` inside
export function proxy(request: NextRequest) {
  return NextResponse.redirect(new URL('/home', request.url))
}

// Alternatively, you can use a default export:
// export default function proxy(request: NextRequest) { ... }

// See "Matching Paths" below to learn more
export const config = {
  matcher: '/about/:path*',
}
```

```js filename="proxy.js" switcher
import { NextResponse } from 'next/server'

// This function can be marked `async` if using `await` inside
export function proxy(request) {
  return NextResponse.redirect(new URL('/home', request.url))
}

// Alternatively, you can use a default export:
// export default function proxy(request) { ... }

// See "Matching Paths" below to learn more
export const config = {
  matcher: '/about/:path*',
}
```

Read more about [using `proxy`](/docs/app/guides/backend-for-frontend.md#proxy), or refer to the `proxy` [API reference](/docs/app/api-reference/file-conventions/proxy.md).
## API Reference

Learn more about Proxy

- [proxy.js](/docs/app/api-reference/file-conventions/proxy.md)
  - API reference for the proxy.js file.
- [Backend for Frontend](/docs/app/guides/backend-for-frontend.md)
  - Learn how to use Next.js as a backend framework