Nuxt2.x Error页面返回自定义请求状态码

news2024/11/23 0:14:22

一、问题描述

最近接到一个需求,针对Nuxt2.x的一个项目进行SEO优化,需要对404页面的状态进行修改,将404页面的请求状态码改为301,而不是404:

在这里插入图片描述

二、解决方案

1.几种无效尝试

(1)layouts下的error.vue文件中使用asyncData重设statusCode:

刚开始的思路是直接在layouts下的error.vue文件中进行设置:

  // 设置状态码为301
  async asyncData({ res }) {
    res.statusCode = 301;
  }

关于asyncDataAPI的介绍可以查看官网文档的介绍:

在这里插入图片描述
其中content如下:

在这里插入图片描述

但实际上,上述的做法这是无效的。因为asyncDatalayouts下的error.vue中并不会执行,可以看一下官方文档的这段描述:

asyncData. This hook can only be placed on page components. Unlike fetch, this hook does not display a loading placeholder during client-side rendering: instead, this hook blocks route navigation until it is resolved, displaying a page error if it fails.

(2)使用middleware

// middleware\setStatusCode.js

export default function (context) {
  // 当访问的路由不存在时,context.res.statusCode此时也为200,也无法像下面那样使用context.error判断
  // if (context.error && context.error.statusCode === 404) {
  //   context.res.statusCode = 301;
  // }

  const routeName = context.route.name;
  const isPageExist = context.app.router.options.routes.some(route => route.name === routeName);
  if (isPageExist) {
    console.log(`The page ${routeName} exists`);
  } else {
    console.log(`The page ${routeName} does not exist`);
    context.res.statusCode = 301;
  }
}
// nuxt.config.js
router: {
	...,
    middleware: [ 'setStatusCode'],
    ...
}

在这里插入图片描述
这种方式如果对于正常存在的路由,是可以在middleware中进行有效的修改,但是对于不存在的路由则无效,结果返回客户端的状态码依然是404。

2.可行方案

创建pages\error.vue结合asyncData

<template>
  <div class="page-404">
    <div>
      <img src="~/assets/images/error.png" alt="页面404">
    </div>
  </div>
</template>

<script>
export default {
  // 设置状态码为301
  async asyncData({ res }) {
    res.statusCode = 301;
  }
}
</script>

注:pages\error.vue中的error不要使用动态路由命名(即以下划线_开头:_error),因为它可能会与nuxt.config.jsrouter.extendRoutes里定义的动态路由冲突,而默认情况下pages\error.vue会优先匹配(如果想知道为什么,可以查看项目根目录下.nuxt\router.js,这个看看到nuxt最终生成的routes,在里面可以看到routes数组里path: "/:error"会出现在router.extendRoutes里定义的动态路由前面。当然如果非要使用_error, 那么可以在尝试nuxt.config.jsrouter.extendRoutes里调整path: "/:error"的顺序)。

现在访问一下/error路径看看:
在这里插入图片描述

但上述这种方式只能针对一级访问路径/xxx(比如,/error)不存在的情况,如果访问的路径是多级(比如,/xxx/xxx)的时候,客户端收到的响应码依然是404:

在这里插入图片描述

因此,我们需要针对无效访问的路径进行路由匹配定义:

// nuxt.config.js

router: {
    extendRoutes (routes, resolve) {
      routes.push(
      	...,
		{
          name: 'errorPage',
          path: '*',
          component: resolve(__dirname, 'pages/error.vue')
        })
    }
}

那么现在只要访问的链接不存在,nuxt返回给客户端的状态码就是301。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1405207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

InternLM第6次课笔记

OpenCompass 大模型评测 测评什么 如何评测 基座模型&#xff1a;加入instrcut 对话模型&#xff1a;直接对话 评测方式 客观 主观 提示词工程 不同prompt鲁棒性 OpenCompass能力框架

Portainer Docker容器可视化管理平台实践

Portainer Docker容器可视化管理平台实践 引安装登录Remote ENV 实践 引 平常用docker命令操作比较多&#xff0c;找了一款docker可视化工具&#xff0c;方便快速预览和批量操作&#xff0c;不想一行一行敲的时候&#xff0c;可以偷偷懒。Portainer试用了一下&#xff0c;安装…

实施企业增长战略:明确需求和战略咨询公司选择尤为重要

在当今快速变化的商业环境中&#xff0c;企业的增长并非偶然产生的成果&#xff0c;而是通过精心设计和策略性规划实现的。企业要实现增长&#xff0c;明确企业自身需求和选择专业的战略咨询公司是非常重要的。接下来&#xff0c;本文就这两大关键问题进行分析。首先&#xff0…

Linux问题 apt-get install时 无法解析域名“cn.archive.ubuntu.com”

问题描述: 在安装程序时会出现无法解析域名的错误 解决办法: 1、编辑文件 sudo vim /etc/resolv.conf 2、在最后加上(按键 i 进入编辑模式) nameserver 8.8.8.8 3、保存退出(:wq)

基于神经网络的电力系统的负荷预测

一、背景介绍&#xff1a; 电力系统负荷预测是生产部门的重要工作之一&#xff0c;通过准确的负荷预测&#xff0c;可以经济合理地安排机组的启停、减少旋转备用容量、合理安排检修计划、降低发电成本和提高经济效益。负荷预测按预测的时间可以分为长期、中期和短期负荷预测。…

用Axure RP 9制作滑块

制作流程 1.打开界面 放置一个水平线 修改长为400 线段为5 2.放入圆 如图 3.修改圆的长和宽 如图 4.将圆变成动态面板 5.设置交互事件 如图 6.增加交互事件 7.增加 8.修改成跟随水平

低压MOS在变频风扇上的应用-REASUNOS瑞森半导体

一、前言 变频风扇是一种利用变频技术进行调速的风扇&#xff1b;它通过改变电机的工作频率来改变风扇的转速&#xff0c;实现不同的风量变化&#xff0c;将普通的单频电机改造成支持变频的电机&#xff0c;用变频器来控制。 变频风扇有如下几个特点&#xff1a; 1. 节能高效…

协同过滤源代码在真实数据集上运行及优化

最近在做推荐算法相关研究&#xff0c; 先拿一个协同过滤代码练手。 网上找代码很容易&#xff0c;但是大多是讲原理的示例代码&#xff0c;在真实数据集上运行问题特别多。 以一个2w节点的开源数据集为例&#xff08;baby.inter&#xff09; https://github.com/enoche/MM…

13.XXL-JOB应用

XXL-JOB应用 1.介绍 XXL-JOB是大众点评员工徐雪里于2015年发布的分布式任务调度平台 2.XXL-JOB与Quartz的关系 老版本依赖Quartz的定时任务触发&#xff0c;在V2.1.0版本开始移除了Quartz 3.官方地址 官方文档&#xff1a;https://www.xuxueli.com/xxl-job/gitee&#xf…

【云原生】初识Docker,安装以及了解操作命令

一、为什么要使用容器&#xff1f; 背景&#xff1a;以前开发、测试、生产为不同的环境&#xff0c;痛点是发现开发测试以后没问题&#xff0c;但是在生产环境无法运行。给测试、开发、运维人员造成了大量的工作。最终结果是发版更新速度也跟不上&#xff0c;效率低 我认为使…

如何制作自己的实景中国视频地图?

让每一个人都有自己的地图&#xff01; 我们在《水经微图Web版1.5.0发布》一文中&#xff0c;提到了水经微图&#xff08;简称“微图”&#xff09;Web版新增了视频气泡的功能。 现在&#xff0c;我们为你分享一下如何基于此功能&#xff0c;制作一个属于自己的实景中国视频地…

Final Cut Pro v10.7.1中文版 专业级视频剪辑软件 兼容M

Final Cut Pro 是 macOS平台上最好的视频剪辑软件&#xff0c;基于Cocoa编写&#xff0c;支持多路多核心处理器&#xff0c;支持GPU加速&#xff0c;支持后台渲染&#xff0c;可编辑从标清到4K的各种分辨率视频&#xff0c;ColorSync管理的色彩流水线则可保证全片色彩的一致性。…

vue常用指令(v-on)

一、v-on 指令 作用: 为元素绑定事件, 比如: v-on:click,可以简写为 click“方法”绑定的方法定义在 VUE实例的, method属性中 二、代码演示 1、v-on绑定点击事件 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&quo…

如何做好一个信息系统项目经理,一个项目经理的个人体会和经验总结(三)

前言 今天我们继续聊聊在 项目开发阶段&#xff0c;项目经理需要做好的事情 &#x1f603; 二、项目开发阶段&#xff08;续&#xff09; 4. 控制好项目开发质量 要控制好项目开发质量&#xff0c;主要是依赖测试&#xff0c;好的产品都是靠不断地测试&#xff0c;不断地试…

yum仓库和NFS文件共享服务

一、yum仓库简介&#xff1a; 1.yum仓库简介&#xff1a; yum是一个基于RPM包&#xff08;是Red-Hat Package Manager红帽软件包管理器的缩写&#xff09;构建的软件更新机制&#xff0c;能够自动解决软件包之间的依赖关系。解决了日常工作中的大量查找安装依赖包的时间 为什…

Vue2中CesiumV1.113.0加载离线地图

Vue2中CesiumV1.113.0加载离线地图&#xff0c;本文以天地图为例。 1.使用nodejs获取天地图 新建nodejsdownmap项目文件夹&#xff0c;初始化项目 npm init -y src/index.js // An highlighted block var Bagpipe require(bagpipe) var fs require("fs"); var r…

【python应用】—利用python构造邮件、解析邮件、发送邮件、接收邮件(email、smtplib、imaplib模块)

文章目录 一、前言1、邮件构成二、email模块1、email模块的Message类Message类常用方法2、email.mine模块:构建电子邮件信息MIMEBase类实现3、email.parser模块:解析电子邮件信息4、email.header模块:丰富、解析邮件头5、email.utils模块:其他工具6、email.iterators模块:…

小程序学习-21

目前小程序分包大小有以下限制&#xff1a; 整个小程序所有分包大小不超过 20M单个分包/主包大小不能超过 2M 独立分包&#xff1a;"independent": true

若依前后台分离vue项目放开前台页面拦截配置

若依前后台分离vue项目放开前台页面拦截配置 使用场景某些页面不需要权限就能直接访问的页面 , 例如做个单点登录之类的。这里只需要修改2处即可 ssologin.vue代码 <template> </template> <script> export default {name: "SsoLogin",data() {r…

Python + Selenium —— ActionChains动作链!

当你需要执行复杂的操作时&#xff0c;比如将一个元素按住拖动到另一个元素上去&#xff0c;需要移动鼠标然后点击并按下键盘某个按键等等。 当然&#xff0c;在 Web 页面上&#xff0c;这种操作好像比较少。 但是&#xff0c;如果遇到了怎么办呢&#xff1f;这就需要用到 Ac…