我们知道,Nuxt打包后会有public目录来存放静态文件,可以直接在这里传一个favicon.ico文件,然后访问项目地址/favicon.ico就可以看到这个图标了,但是有时候就是不想传一个固定的,就是想动态的从后台设置网站图标,怎么办
最初的实现
一开始,我是用Nuxt的useHead来把图标插进Html里面
这确实可以实现部分浏览器的图标显示
后来发现在safari浏览器里面标签页上面的显示的还是public下面我没删掉的默认的Nuxt图标,并且一些网上获取网站Favicon图标的接口,获取的也不准确,抓到的也是默认的/public目录下面的favicon.ico
例如这种网站
我没有仔细研究,我认为他们这些接口应该是直接访问目标站/favicon.ico,来确定有没有favicon图标的,没有就显示他们默认的图标
所以我就想怎么实现监听 /favicon.ico,然后跳转到我后台设置的正确图标地址
最后的实现
之后在Nuxt文档里面找到了服务器中间件,它将在任何其他服务器路由之前在每个请求上运行
之后我在server目录下创建了一个middleware文件夹,来放中间件,并创建了下面这样的中间件
先前我试过用Nuxt根目录的middleware来实现,但是这个地方的中间件监听不到,之后就选择了这个server端的middleware
事实证明,它确实可以完成监听/favicon.ico这个路径,然后跳转到我们需要的地址,需要注意的是,这个阶段好像拿不到Nuxt实例 (目前我认为是这样的),不过运行时配置可以拿到,我就用里面我设置的接口baseURL再拼接一下后端的公共设置接口得到正确的favicon图标地址,再使用sendRedirect方法跳转过去,就实现了
需要注意的是,如果这里监听的是静态文件地址,请先把/public目录下对应的文件删除,它才可以监听到