Nextjs 14 / Next.js 14 更改项目结构添加国际化后图标问题

Nextjs 14 / Next.js 14 favicon problem after changing project structure to add Internationalization

提问人:mondevyat 提问时间:11/14/2023 最后编辑:mondevyat 更新时间:11/15/2023 访问量:41

问:

我在 Next.js 14.0.2 中面临网站图标显示问题。在我添加内部化并更改了我的项目结构后,问题就出现了。简而言之,这是我的项目结构:

- app
  - [lang]
    - _components
    - _dictionaries
    - dictionaries.ts
    - layout.tsx
    - page.tsx
  - favicon.ico

middleware.ts     

在我将所有常规文件从 app 文件夹移动到 [lang] 后,我创建了中间件,根据用户的区域设置将用户从 / 重定向到 /en/ru

import { match } from '@formatjs/intl-localematcher';
import Negotiator from 'negotiator';

function getLocale(request: any): string {
    const headers = request.headers || {};
    const acceptLanguageHeader = headers['accept-language'] || 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7';
    const negotiator = new Negotiator({ headers: { 'accept-language': acceptLanguageHeader } });
    const languages = negotiator.languages();
    const locales = ['ru', 'en'];
    const defaultLocale = 'ru';

    return match(languages, locales, defaultLocale);
}

export function middleware(request: any) {
    const { pathname } = request.nextUrl;
    const locales = ['ru', 'en'];

    const pathnameHasLocale = locales.some(
        (locale) => pathname.startsWith(`/${locale}/`) || pathname === `/${locale}`
    );

    if (pathnameHasLocale) return;

    const locale = getLocale(request);
    request.nextUrl.pathname = `/${locale}${pathname}`;
    return Response.redirect(request.nextUrl);
}

export const config = {
    matcher: [
        '/((?!_next).*)',
    ],
};

所以现在我在网络选项卡中有两个 favicon.ico GET 请求,并且该图标未显示在浏览器的选项卡上。第一个返回 302 Found(在 localhost:3000/favicon.ico),下一个返回 404 Not Found(现在在具有区域设置路径 localhost:3000/en/favicon.ico 的不同 URL 上)。有什么想法可以解决这个问题吗?如有必要,我将用必要的清单和说明来补充这个问题。

带代码的 repo:https://github.com/mondevyat/next1402/

下一个.js 图标 i18下一个 应用路由器

评论


答:

1赞 troinovm 11/15/2023 #1

您需要在中间件的匹配器中排除图标。

matcher: [
"/((?!api|_next/static|_next/image|img/|favicon.ico).*)",
]

看这里: nextjsMatcherDoc