问题

最近在使用vuepress-theme-reco构建属于自己的博客,感兴趣的同学可以自己去官网上构建自己的博客。
在使用这个框架构建博客的时候,发现了一个及其令人头疼的问题——中文标签返回404,具体的表现形式:

解决办法

很快的啊,我找到了issue,里面的大佬已经给了对应的解释和解决办法。

问题原因:

浏览器对直接输入的中文url做了一次encode导致 匹配不到对应的path,然后就打到了404的路由

大佬给了两条解决办法:

  1. 直接修改node_modules/vue-router/dist/vue-router.esm.js的源码,如果项目仅仅是一个人开发,这种解决办法是十分简单的,对应的代码如下。但是我个人是不太喜欢这种方案,所以是直接采用第二种方案。
// 修改vue-router.esm.js里面的match函数,增加两行代码
function match (raw,currentRoute,redirectedFrom) {if(typeof raw ==='string'){raw = decode(raw)}// ...code
}
  1. 可以通过将主题更换到本地,而后修改 vuepress-theme-reco 本地主题的 enhanceApp.js 对应源码解决该问题,这样只要不更新主题就可一次解决。
// enhanceApp.js
import postMixin from '@theme/mixins/posts'
import localMixin from '@theme/mixins/locales'
import { addLinkToHead } from '@theme/helpers/utils'
import { registerCodeThemeCss } from '@theme/helpers/other'import Router from 'vue-router'const router = new Router({mode: 'history'
})// 防止相同路由跳转时报错
const VueRouterPush = Router.prototype.push
Router.prototype.push = function push (to) {return VueRouterPush.call(this, to).catch(err => err)
}export default ({Vue,siteData,isServer,router
}) => {Vue.mixin(postMixin)Vue.mixin(localMixin)if (!isServer) {addLinkToHead('//at.alicdn.com/t/font_1030519_2ciwdtb4x65.css')registerCodeThemeCss(siteData.themeConfig.codeTheme)}router.beforeEach((to, from, next) => {// 解决非ASCII文件名的路由, 防止 404const decodedPath = decodeURIComponent(to.path)if (decodedPath !== to.path) {next(Object.assign({}, to, {fullPath: decodeURIComponent(to.fullPath),path: decodedPath}))} else {next()}})
}

不建议直接复制粘贴大佬的代码,每个人的版本可能不一致,看自己的enhanceApp.js文件里面缺什么粘贴什么。

新的问题

我直接采用方案2, 但是经过尝试之后发现新的问题,所有带中文的链接跳转不了,报错原因:

这报错原因,我熟啊!栈溢出了。原因也很简单,就是路由重复跳转导致的:

将跳转的路径进行decodeURIComponent转换成正常的中文路径,这样路由就可以匹配上了,但是重新跳转之后,浏览器又会将url进行一次encode,也就是说,再次跳转的时候还是会经过 decodePath !== to.path 这个判断条件,一直重复下去,直到栈溢出。

问题的产生原因大致上了解清楚了,解决就很简单了,记录上次格式化的路径就行了,代码如下:

let pre_path = null // 上次格式化的路径
// ……code
router.beforeEach((to, from, next) => {// 解决非ASCII文件名的路由, 防止 404const decodedPath = decodeURIComponent(to.path)if (decodedPath !== to.path && decodedPath!== pre_path) {pre_path = decodedPathnext(Object.assign({}, to, {fullPath: decodeURIComponent(to.fullPath),path: decodedPath}))} else {next()}})

但你以为问题就这么解决了?

新新问题


看来方案二的思路并不适合我这种小白同学,不管怎么改动路由逻辑,终究还是会出现瑕疵。但是在改动代码的时候,我注意到了一点:

大佬改动了一点push的代码逻辑,这段代码倒是提醒了我,方案一不是在match的源码上添加一小段新的源码,而这段代码只是对穿的参数raw进行一个格式化操作,那我为何不用原型链改动match的代码逻辑?

新的解决办法

最终改动的enhanceApp.js代码为:

// enhanceApp.js
/* eslint-disable no-proto */
import postMixin from '@theme/mixins/posts'
import localMixin from '@theme/mixins/locales'
import { addLinkToHead, addScriptToHead } from '@theme/helpers/utils'
import { registerCodeThemeCss, interceptRouterError } from '@theme/helpers/other'
import VueCompositionAPI from '@vue/composition-api'import Router from 'vue-router'// 该函数为vue-router.esm.js里面的一段源码,直接拿来使用
function decode (str) {try {return decodeURIComponent(str)} catch (err) {if (process.env.NODE_ENV !== 'production') {warn(false, ("Error decoding \"" + str + "\". Leaving it intact."));}}return str
}const VueRouterMatch = Router.prototype.match
Router.prototype.match = function match (raw, currentRoute, redirectedFrom) {if (typeof raw === 'string') {raw = decode(raw)}return VueRouterMatch.call(this, raw, currentRoute, redirectedFrom)
}export default ({Vue,siteData,isServer,router
}) => {Vue.use(VueCompositionAPI)Vue.mixin(postMixin)Vue.mixin(localMixin)if (!isServer) {addLinkToHead('//at.alicdn.com/t/font_1030519_2ciwdtb4x65.css')registerCodeThemeCss(siteData.themeConfig.codeTheme)}
}

最终解决方案

经过上面的探索,已经把中文标签跳转返回404的问题已经解决了,方案两种:

  1. 改动node_modules/vue-router/dist/vue-router.esm.js源码的match函数,增加两行代码。当然了,这种改动不是我的菜。
  2. 将主题复制粘贴到.vuepress文件中,改名为theme,然后再改动enhanceApp.js代码,代码就在新的解决办法里,自己可以去翻翻。

如果嫌麻烦,可以直接采用方案一;如果想要魔改一下主题,不嫌麻烦的,可以选择方案二;如果像我一样嫌麻烦,又不想用方案一,可以采用方案三。

我们的.vuepress文件里面本来配置了enhanceApp.js文件,这个文件具体是什么情况用,可以点击传送门查看

方案三:

// 直接修改.vuepress文件夹里面的enhanceApp.js文件,增加下面代码,为方便,我就直接复制粘贴我的enhanceApp.js文件了
/*** 扩展 VuePress 应用*/
import Element from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'// 新增代码
import Router from 'vue-router'
function decode (str) {try {return decodeURIComponent(str)} catch (err) {if (process.env.NODE_ENV !== 'production') {warn(false, ("Error decoding \"" + str + "\". Leaving it intact."));}}return str
}const VueRouterMatch = Router.prototype.match
Router.prototype.match = function match (raw, currentRoute, redirectedFrom) {if (typeof raw === 'string') {raw = decode(raw)}return VueRouterMatch.call(this, raw, currentRoute, redirectedFrom)
}
// endexport default ({Vue
}) => {// ...做一些其他的应用级别的优化Vue.use(Element)
}

原文链接

传送门

参考资料

分类和标签包含中文会导致路由匹配不到,跳转至404页面

解决vuepress-theme-reco中文标签跳转返回404问题相关推荐

  1. php连接数据库404错误代码,访问编码后的中文URL返回404错误的解决方法,url404_PHP教程...

    访问编码后的中文URL返回404错误的解决方法,url404 昨天做一个项目,其中有一个需求是每一张图片对应一小段文字对图片的说明,普通的做法是新建一个表然后把图片名与说明文字都记录到数据库内.仔细考 ...

  2. 安全狗php站点404,访问编码后的中文URL返回404错误的解决方法

    昨天做一个项目,其中有一个需求是每一张图片对应一小段文字对图片的说明,普通的做法是新建一个表然后把图片名与说明文字都记录到数据库内.仔细考虑后感觉这个应用不要数据库也能完成,我实现的方案是把说明文字U ...

  3. 爬虫爬取数据时,网页响应码返回404问题的解决方法

    爬虫报404问题: 在进行爬虫爬取数据的过程中,使用语句: r = requests.get(url, timeout=60, headers=headers, stream=True) # prin ...

  4. 服务器不能显示中文,彻底解决delphi WebBroker服务器中文乱码 delphi WebBroker服务器不能显示中文网页 WebBroker中文显示乱码...

    彻底解决delphi WebBroker服务器中文乱码 彻底解决WebBroker中文显示乱码 彻底解决delphi WebBroker服务器不能显示中文网页 这个问题被折腾惨啦! 网上一大堆,就没能 ...

  5. 解决FusionCharts联动的中文乱码.

    解决FusionCharts联动的中文乱码. 问题内容: 使用fusioncharts 时,也许你想在如demo.html 这个页面点击Chart的一个部分,然后显示这个部分的详细内容. fusion ...

  6. 小木虫网站登录返回404

    最近搜东西时,看到小木虫网站的回答,需要登录才能查看全部,就等了下半年没登录账号,结果发现一点登录返回了404,开始还以为是服务器炸了.后来才发现是账号被封了.. 被封账号一登录,小木虫就会在客户端写 ...

  7. 中文提交到git乱码_解决git 提交后中文字符会乱码的问题

    解决git 提交后中文字符会乱码的问题 最近发生那了一件怪事,当然菜鸡经常碰见怪事 本来一个.properties文件在idea里面commit的时候看了一下diff,没发现异常,但是提交到gitla ...

  8. php数据库查询中文方块,解决Python数据可视化中文部分显示方块问题

    一.问题 代码如下,发现标题的中文显示的是方块 import matplotlib import matplotlib.pyplot as plt fig = plt.figure() ax = fi ...

  9. linux 下,解决tomcat服务器接收中文乱码的问题

    linux 下,解决tomcat服务器接收中文乱码的问题 参考文章: (1)linux 下,解决tomcat服务器接收中文乱码的问题 (2)https://www.cnblogs.com/taz372 ...

最新文章

  1. 2022-2028年中国橡胶板的制造行业发展战略规划及投资方向研究报告
  2. HTML5 应用的现状与前景
  3. 003_Servlet生命周期
  4. Maven web项目创建
  5. thinkphp URL相关
  6. MySql 5.7.19 源代码安装 for ubuntu 16.04
  7. 线性一致性理解Linearizability
  8. 前端学习(2756):condition模拟启动配置
  9. 四阶混合累积量matlab_12m氢燃料电池城市客车电电混合动力系统设计方案
  10. a标签的href传递信息
  11. finalize方法注意事项(防止子类没有显示调用super.finalize())
  12. SLAM学习笔记-------------(五)相机与图像
  13. 高等数学微积分公式大全
  14. Android-MeasureSpec那些事 1
  15. JSON与聚合数据不解之缘二
  16. pycorrector 纠错工具安装
  17. 企业网络安全建设必须要知道的终端产品
  18. 1.2.2-凑零钱问题(暴力递归+动态规划)
  19. bitcoin简析一
  20. ubuntu 20.04 安装 QQ 和 Wechat 及其卸载, 解决微信不能发图片, 输入框输入中文显示方块问题

热门文章

  1. qt打印预览html,QT 5.9 实现 QWebEngineView 打印html内容
  2. 【python常用小工具】python打印26个英文字母
  3. 好教程推荐系列:收录常见的Qt面试题
  4. 解决error mounted is not defined no-undef
  5. unity-IL2CPP工程打包失败记录
  6. 浅析GPU通信技术(上)-GPUDirect P2P
  7. 手机号码归属地api文档
  8. 5G系统——5G-GUTI、5G-TMSI、5G-S-TMSI、SUPI、SUCI
  9. 利用Spire实现对Word模板的指定文字替换(文字、图片、表格)
  10. 公众号运营,如何快速找到内容定位?