在next.js中基于国家重定向

c0vxltue  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(102)

我是Next.js的新手,我想在用户访问网站时将其重定向到默认页面,例如,如果用户的国家/地区是us,我想将其重定向到domain.com/us等等,这是我的尝试:

type Middleware = (req: NextRequest) => Promise<NextResponse>;

export const middleware: Middleware = async (req) => {
    const response = await fetch(`http://ip-api.com/json`);
    const data = await response.json();

    if (data.country === "Egypt") {
        console.log('Egypt')
        const newPath = `/egypt${req.nextUrl.pathname}${req.nextUrl.search}`;
        const newUrl = new URL(newPath, req.url);

        // Redirect with the new URL
        return NextResponse.redirect(newUrl, { status: 301 });
    } else {
        return NextResponse.next();
    }

};

export const config = {
    matcher: [
        /*
         * Match all request paths except for the ones starting with:
         * - api (API routes)
         * - static (static files)
         * - favicon.ico (favicon file)
         * - _next (debug files)
         */
        "/((?!api|static|favicon.ico|_next|_next/image|images).*)"
    ]
};

字符串
我尝试的问题是我有这个错误err_too_many_redirects

ee7vknir

ee7vknir1#

很可能,问题是在你重定向用户之后,它会导致中间件再次重定向(和重定向)用户。这可以通过多种方法解决,最好的方法是检查URL,看看它是否已经有地理标签。
在重定向之前将此添加到中间件'if Egypt'函数中,以确保您不会得到'err_too_many_redirects'错误:

if (req.nextUrl.pathname.startsWith('/egypt')) {
    return NextResponse.next()
}

字符串

相关问题