rewrites
Yeniden yazmalar, gelen bir istek yolunu farklı bir hedef yolla eşlemenize olanak tanır.
Yeniden yazmalar bir URL proxy'si olarak hareket eder ve hedef yolu maskeleyerek kullanıcının sitedeki konumunu değiştirmemiş gibi görünmesini sağlar. Bunun aksine, yönlendirmeler yeni bir sayfaya yönlendirir ve URL değişikliklerini gösterir.
Yeniden yazmaları kullanmak için next.config.js adresindeki rewrites tuşunu kullanabilirsiniz:
module.exports = {
async rewrites() {
return [
{
source: '/about',
destination: '/',
},
]
},
}Yeniden yazmalar istemci tarafı yönlendirmeye uygulanır, bir <Link href="/about"> yukarıdaki örnekte uygulanan yeniden yazmaya sahip olacaktır.
rewrites source ve destination özelliklerine sahip nesneler içeren bir dizi veya dizilerden oluşan bir nesne (aşağıya bakın) döndürmeyi bekleyen bir asenkron işlevdir:
source:String- gelen istek yolu modelidir.destination:Stringyönlendirmek istediğiniz yoldur.basePath:falseveyaundefined- false ise basePath eşleştirme sırasında dahil edilmeyecektir, sadece harici yeniden yazmalar için kullanılabilir.locale:falseveyaundefined- eşleştirme sırasında yerel ayarın dahil edilmemesi gerekip gerekmediği.hastype,keyvevalueözelliklerine sahip has nesnelerinden oluşan bir dizidir.missingtype,keyvevalueözelliklerine sahip eksik nesnelerden oluşan bir dizidir.
rewrites işlevi bir dizi döndürdüğünde, yeniden yazmalar dosya sistemi (sayfalar ve /public dosyaları) kontrol edildikten sonra ve dinamik rotalardan önce uygulanır. rewrites işlevi belirli bir şekle sahip bir dizi nesnesi döndürdüğünde, Next.js'nin v10.1 adresinden itibaren bu davranış değiştirilebilir ve daha hassas bir şekilde kontrol edilebilir:
module.exports = {
async rewrites() {
return {
beforeFiles: [
// These rewrites are checked after headers/redirects
// and before all files including _next/public files which
// allows overriding page files
{
source: '/some-page',
destination: '/somewhere-else',
has: [{ type: 'query', key: 'overrideMe' }],
},
],
afterFiles: [
// These rewrites are checked after pages/public files
// are checked but before dynamic routes
{
source: '/non-existent',
destination: '/somewhere-else',
},
],
fallback: [
// These rewrites are checked after both pages/public files
// and dynamic routes are checked
{
source: '/:path*',
destination: `https://my-old-site.com/:path*`,
},
],
}
},
}Bilmekte fayda var:
beforeFilesadresindeki yeniden yazmalar, bir kaynakla eşleştikten hemen sonra dosya sistemini/dinamik rotaları kontrol etmez, tümbeforeFileskontrol edilene kadar devam eder.
Next.js rotalarının kontrol edilme sırası şöyledir:
- başlıklar kontrol edilir/uygulanır
- yönlendirmeler kontrol edilir/uygulanır
beforeFilesyeniden yazmalar kontrol edilir/uygulanır- genel dizindeki statik dosyalar,
_next/staticdosyaları ve dinamik olmayan sayfalar kontrol edilir/servis edilir afterFilesyeniden yazmalar kontrol edilir/uygulanır, bu yeniden yazmalardan biri eşleşirse, her eşleşmeden sonra dinamik rotaları/statik dosyaları kontrol ederizfallbackyeniden yazmalar kontrol edilir/uygulanır, bunlar 404 sayfası oluşturulmadan önce ve dinamik rotalar/tüm statik varlıklar kontrol edildikten sonra uygulanır.getStaticPathsadresinde fallback: true/'blocking' kullanırsanız,next.config.jsadresinizde tanımlanan fallbackrewritesçalıştırılmayacaktır.
Rewrite parameters
Bir yeniden yazmada parametreler kullanıldığında, parametrelerin hiçbiri destination adresinde kullanılmadığında parametreler varsayılan olarak sorguda geçirilecektir.
module.exports = {
async rewrites() {
return [
{
source: '/old-about/:path*',
destination: '/about', // The :path parameter isn't used here so will be automatically passed in the query
},
]
},
}Hedefte bir parametre kullanılırsa, parametrelerin hiçbiri sorguda otomatik olarak geçirilmeyecektir.
module.exports = {
async rewrites() {
return [
{
source: '/docs/:path*',
destination: '/:path*', // The :path parameter is used here so will not be automatically passed in the query
},
]
},
}Hedefte zaten bir sorgu kullanılmışsa, sorguyu destination adresinde belirterek parametreleri sorguda manuel olarak geçirebilirsiniz.
module.exports = {
async rewrites() {
return [
{
source: '/:first/:second',
destination: '/:first?second=:second',
// Since the :first parameter is used in the destination the :second parameter
// will not automatically be added in the query although we can manually add it
// as shown above
},
]
},
}Bilmekte fayda var: Otomatik Statik Optimizasyondan gelen statik sayfalar veya yeniden yazmalardan gelen ön oluşturma paramları, hidrasyondan sonra istemcide ayrıştırılacak ve sorguda sağlanacaktır.
Path Matching
Yol eşleşmelerine izin verilir, örneğin /blog/:slug, /blog/hello-world ile eşleşir (iç içe geçmiş yollar yoktur):
module.exports = {
async rewrites() {
return [
{
source: '/blog/:slug',
destination: '/news/:slug', // Matched parameters can be used in the destination
},
]
},
}Wildcard Path Matching
Bir joker karakter yolunu eşleştirmek için bir parametreden sonra * kullanabilirsiniz; örneğin /blog/:slug*, /blog/a/b/c/d/hello-world ile eşleşecektir:
module.exports = {
async rewrites() {
return [
{
source: '/blog/:slug*',
destination: '/news/:slug*', // Matched parameters can be used in the destination
},
]
},
}Regex Path Matching
Bir regex yolunu eşleştirmek için regex'i bir parametreden sonra parantez içine alabilirsiniz; örneğin /blog/:slug(\\d{1,}), /blog/123 ile eşleşir ancak /blog/abc ile eşleşmez:
module.exports = {
async rewrites() {
return [
{
source: '/old-blog/:post(\\d{1,})',
destination: '/blog/:post', // Matched parameters can be used in the destination
},
]
},
}Aşağıdaki karakterler (, ), {, }, :, *, +, ? regex yol eşleştirmesi için kullanılır, bu nedenle source içinde özel olmayan değerler olarak kullanıldıklarında önlerine \\ eklenerek kaçılmalıdır:
module.exports = {
async rewrites() {
return [
{
// this will match `/english(default)/something` being requested
source: '/english\\(default\\)/:slug',
destination: '/en-us/:slug',
},
]
},
}Header, Cookie, and Query Matching
Yalnızca başlık, çerez veya sorgu değerleri de has alanıyla eşleştiğinde veya missing alanıyla eşleşmediğinde bir yeniden yazmayı eşleştirmek için kullanılabilir. Yeniden yazmanın uygulanabilmesi için hem source hem de tüm has öğelerinin eşleşmesi ve tüm missing öğelerinin eşleşmemesi gerekir.
has ve missing öğeleri aşağıdaki alanlara sahip olabilir:
type:String-header,cookie,hostveyaqueryadreslerinden biri olmalıdır.key:String- seçilen türden eşleştirilecek anahtar.value:Stringveyaundefined- kontrol edilecek değer, tanımlanmamışsa herhangi bir değer eşleşecektir. Değerin belirli bir bölümünü yakalamak için regex benzeri bir dize kullanılabilir, örneğinfirst-secondiçinfirst-(?<paramName>.*)değeri kullanılırsa,secondhedefte:paramNameile kullanılabilir.
module.exports = {
async rewrites() {
return [
// if the header `x-rewrite-me` is present,
// this rewrite will be applied
{
source: '/:path*',
has: [
{
type: 'header',
key: 'x-rewrite-me',
},
],
destination: '/another-page',
},
// if the header `x-rewrite-me` is not present,
// this rewrite will be applied
{
source: '/:path*',
missing: [
{
type: 'header',
key: 'x-rewrite-me',
},
],
destination: '/another-page',
},
// if the source, query, and cookie are matched,
// this rewrite will be applied
{
source: '/specific/:path*',
has: [
{
type: 'query',
key: 'page',
// the page value will not be available in the
// destination since value is provided and doesn't
// use a named capture group e.g. (?<page>home)
value: 'home',
},
{
type: 'cookie',
key: 'authorized',
value: 'true',
},
],
destination: '/:path*/home',
},
// if the header `x-authorized` is present and
// contains a matching value, this rewrite will be applied
{
source: '/:path*',
has: [
{
type: 'header',
key: 'x-authorized',
value: '(?<authorized>yes|true)',
},
],
destination: '/home?authorized=:authorized',
},
// if the host is `example.com`,
// this rewrite will be applied
{
source: '/:path*',
has: [
{
type: 'host',
value: 'example.com',
},
],
destination: '/another-page',
},
]
},
}Rewriting to an external URL
Yeniden yazmalar, harici bir url'ye yeniden yazmanıza olanak tanır. Bu özellikle Next.js'yi aşamalı olarak benimsemek için kullanışlıdır. Aşağıda, ana uygulamanızın /blog rotasını harici bir siteye yönlendirmek için örnek bir yeniden yazma verilmiştir.
module.exports = {
async rewrites() {
return [
{
source: '/blog',
destination: 'https://example.com/blog',
},
{
source: '/blog/:slug',
destination: 'https://example.com/blog/:slug', // Matched parameters can be used in the destination
},
]
},
}trailingSlash: true adresini kullanıyorsanız, source parametresine de bir sondaki eğik çizgi eklemeniz gerekir. Hedef sunucu da sonda eğik çizgi bekliyorsa, destination parametresine de eklenmelidir.
module.exports = {
trailingSlash: true,
async rewrites() {
return [
{
source: '/blog/',
destination: 'https://example.com/blog/',
},
{
source: '/blog/:path*/',
destination: 'https://example.com/blog/:path*/',
},
]
},
}Incremental adoption of Next.js
Ayrıca Next.js'nin tüm Next.js rotalarını kontrol ettikten sonra mevcut bir web sitesine proxy göndermeye geri dönmesini sağlayabilirsiniz.
Bu şekilde, Next.js'ye daha fazla sayfa taşırken yeniden yazma yapılandırmasını değiştirmeniz gerekmez
module.exports = {
async rewrites() {
return {
fallback: [
{
source: '/:path*',
destination: `https://custom-routes-proxying-endpoint.vercel.app/:path*`,
},
],
}
},
}Rewrites with basePath support
Yeniden yazımlarla basePath desteğinden yararlanırken, yeniden yazıma basePath: false eklemediğiniz sürece her source ve destination 'nin önüne otomatik olarak basePath eklenir:
module.exports = {
basePath: '/docs',
async rewrites() {
return [
{
source: '/with-basePath', // automatically becomes /docs/with-basePath
destination: '/another', // automatically becomes /docs/another
},
{
// does not add /docs to /without-basePath since basePath: false is set
// Note: this can not be used for internal rewrites e.g. `destination: '/another'`
source: '/without-basePath',
destination: 'https://example.com',
basePath: false,
},
]
},
}Rewrites with i18n support
Yeniden yazmalarla i18n desteğinden yararlanırken, yeniden yazmaya locale: false eklemediğiniz sürece her source ve destination yapılandırılmış locales 'u işlemek için otomatik olarak öneklenir. locale: false kullanılıyorsa, doğru şekilde eşleşmesi için source ve destination 'nin önüne bir yerel ayar eklemelisiniz.
module.exports = {
i18n: {
locales: ['en', 'fr', 'de'],
defaultLocale: 'en',
},
async rewrites() {
return [
{
source: '/with-locale', // automatically handles all locales
destination: '/another', // automatically passes the locale on
},
{
// does not handle locales automatically since locale: false is set
source: '/nl/with-locale-manual',
destination: '/nl/another',
locale: false,
},
{
// this matches '/' since `en` is the defaultLocale
source: '/en',
destination: '/en/another',
locale: false,
},
{
// it's possible to match all locales even when locale: false is set
source: '/:locale/api-alias/:path*',
destination: '/api/:path*',
locale: false,
},
{
// this gets converted to /(en|fr|de)/(.*) so will not match the top-level
// `/` or `/fr` routes like /:path* would
source: '/(.*)',
destination: '/another',
},
]
},
}Version History
| Version | Changes |
|---|---|
v13.3.0 | missing added. |
v10.2.0 | has added. |
v9.5.0 | Headers added. |