我在 Next.js 14.0.2 中遇到了 favicon 显示问题。在我添加 internalization 并更改我的项目结构后,问题出现了。简而言之,这是我的项目结构:
- 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 上) )。有什么想法可以解决这个问题吗?如果有必要,我会用必要的清单和说明来补充问题。
您需要在中间件的匹配器中排除 favicon。
matcher: [
"/((?!api|_next/static|_next/image|img/|favicon.ico).*)",
]
看这里:nextjsMatcherDoc